当前位置: 首页 > article >正文

L2-043 龙龙送外卖(dfs)

龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。

每到中午 12 点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙龙简单就送好了;但随着大数据的分析,龙龙被派了更多的单子,也就送得越来越累……

看着一大堆订单,龙龙想知道,从外卖站出发,访问所有点了外卖的地方至少一次(这样才能把外卖送到)所需的最短路程的距离到底是多少?每次新增一个点外卖的地址,他就想估算一遍整体工作量,这样他就可以搞明白新增一个地址给他带来了多少负担。

输入格式:

输入第一行是两个数 N 和 M (2≤N≤105, 1≤M≤105),分别对应树上节点的个数(包括外卖站),以及新增的送餐地址的个数。

接下来首先是一行 N 个数,第 i 个数表示第 i 个点的双亲节点的编号。节点编号从 1 到 N,外卖站的双亲编号定义为 −1。

接下来有 M 行,每行给出一个新增的送餐地点的编号 Xi​。保证送餐地点中不会有外卖站,但地点有可能会重复。

为了方便计算,我们可以假设龙龙一开始一个地址的外卖都不用送,两个相邻的地点之间的路径长度统一设为 1,且从外卖站出发可以访问到所有地点。

注意:所有送餐地址可以按任意顺序访问,且完成送餐后无需返回外卖站

输出格式:

对于每个新增的地点,在一行内输出题目需要求的最短路程的距离。

输入样例:

7 4
-1 1 1 1 2 2 3
5
6
2
4

输出样例:

2
4
4
6
#include<bits/stdc++.h>
using namespace std;
vector<int>tree;
vector<int>children[100005];
int path[100005]={0};
bool vis[100005]={false};
void dfs(int root){
    queue<pair<int,int>>pq;
    pq.push({root,path[root]});
    while(!pq.empty()){
        int pa=pq.front().first;
        int deep=pq.front().second;
        pq.pop();
        path[pa]=deep;
        for(int u:children[pa]){
            pq.push({u,deep+1});
        }
    }
}
void solve(){
    int n,m;
    cin>>n>>m;
    tree.resize(n+1);
    int root;
    for(int i=1;i<=n;i++){
        cin>>tree[i];
        if(tree[i]==-1){
            root=i;
        }else{
            children[tree[i]].push_back(i);
        }
    }
    dfs(root);
    set<int>address;
    int total=0;
    int maxn=0;
    for(int i=0;i<m;i++){
        int q;
        cin>>q;
        maxn=max(path[q],maxn);
        while(q!=root&&!vis[q]){
            vis[q]=true;
            total++;
            q=tree[q];
        }
        cout<<total*2-maxn<<endl;
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    solve();
    return 0;
}

 


http://www.kler.cn/a/565964.html

相关文章:

  • 《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战
  • HTML+CSS基础知识
  • 本地安装多个JDK版本自由切换【详解 附有图文步骤】
  • springboot使用redis
  • 【现代前端框架中本地图片资源的处理方案】
  • 学Java第二十九天-----继承中的构造方法和this、super关键字
  • PyQT(PySide)的上下文菜单策略设置setContextMenuPolicy()
  • 天佐.崆峒印 异常崩溃检测分析
  • 【和鲸社区获奖作品】内容平台数据分析报告
  • 力扣-动态规划-198 打家劫舍
  • Kettle 连接 Oracle 数据库全流程指南
  • 【leetcode hot 100 438】找到字符串中所有字母异位词
  • JavaScript 垃圾回收与内存泄漏:原理与应对策略
  • Vue 3 路由管理实战:构建多页面博客导航 - 掌握 Vue Router 实现 SPA 页面跳转
  • 物理内存组织与分配的核心概念
  • tidb集群基于多副本容灾
  • DS32编译优化问题【deepseek的功劳】
  • Spring MVC 的执行流程
  • Python基于Django和人脸识别的在线票务系统设计与实现
  • 【Docker】Linux部署web版Firefox