天梯赛 L2-043 龙龙送外卖

在这里插入图片描述
在这里插入图片描述
分析:
这题是一道很好的DFS题,首先我们要找规律,发现这个最短路径其实是我们所走路程两倍再减去到根节点最长的那条边,因此我们DFS的过程中一直维护一个所走的路径的长度以及最长的点到根节点的距离,就可以把这题给做出来了。

补充一下这题的讲解地址,在AcWing,里面有视频讲解,不懂可以去看一下
https://www.acwing.com/problem/content/4477/

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int dis[maxn], p[maxn];//dis是该点到根节点的距离, p是该点的父节点 
int sum; //记得是当前情况下所需要走过的单程路程,不包括回程 
int maxx,n,m;//maxx记录的是离根结点最远的那个点的距离 
int dfs(int u){
	if(p[u]==-1||dis[u]>0) return dis[u];
	sum++;
	dis[u]=dfs(p[u])+1;
	return dis[u];
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) scanf("%d",&p[i]);
	while(m--){
		int x;
		scanf("%d",&x);
		maxx=max(maxx,dfs(x));
		printf("%d\n",sum*2-maxx);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值