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

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;
}

 

相关文章:

  • Java中的ArrayDeque
  • 安全运营的“黄金4小时“:如何突破告警疲劳困局
  • WSDM24-因果推荐|因果去偏的可解释推荐系统
  • leetcode-442.数组中重复的数据
  • 用Java编写sql
  • 51单片机中reg52.h与regx52.h在进行位操作时的不同
  • 大语言模型:从诞生到未来的探索
  • 015--基于STM32F103ZET6的智能风扇设计
  • 字符串反转
  • docker使用代理的简单配置
  • IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)
  • TPA张量成绩注意力详解及代码复现
  • 第16天:C++多线程完全指南 - 从基础到现代并发编程
  • php序列化与反序列化
  • github操作
  • 发票识别详解-发票ocr-发票录入接口-发票信息识别
  • lua基础语法学习
  • AI人工智能机器学习之聚类分析
  • HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统
  • MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)
  • 建设手机银行官方网站/现在有哪些网址
  • 太原医疗网站建设/软文的概念是什么
  • 做网站怎么能在百度搜索到/seo成创网络
  • 做网站属于广告费吗/2023网站分享
  • 用ppt做网站方法/厦门seo服务
  • 上海搜索引擎推广公司/图片seo优化是什么意思