题目链接:PTA | 程序设计类实验辅助教学平台
思路:
假设龙龙每次送完外卖都回到原点,即他走的路程就是 每个点到已经访问过得点的距离*2 的总和。最后一次可以不返回原点,因此最终减掉一个离原点最大的距离。
这里写了两个dfs:
dfs : 返回x点到已访问过结点的最短距离
dfs2 : 返回x点到原点的距离
代码:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N = 100005;
int fa[N];
int dis[N],dis2[N];
int ans,max_length;
int n,m;
int x;
int dfs(int x)
{
if(dis[x]!=-1) return 0;
if(fa[x]==-1) return 0;
return dis[x]=dfs(fa[x])+1;
}
int dfs2(int x)
{
if(dis2[x]!=-1) return dis2[x];
if(fa[x]==-1) return dis2[x]=0;
return dis2[x]=dfs2(fa[x])+1;
}
int main()
{
memset(dis,-1,sizeof dis);
memset(dis2,-1,sizeof dis2);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>fa[i];
for(int i=1;i<=m;i++)
{
cin>>x;
ans+=dfs(x)*2;
//cout<<"dfs2 "<<dfs2(x)<<endl;
max_length=max(max_length,dfs2(x));
cout<<ans-max_length<<endl;
}
return 0;
}