版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36172505/article/details/82219559
题目链接:
网络延时
题目大意:
中文题目,不解释2333
解题思路:
在树上找最远的两点距离,我们可以知道,其中一个点必定是离根结点最远的一点,即深度最大的(证明略,应该很容易理解吧2333),那么我们只需要从深度最大的某个点出发,dfs一遍,最远的那个距离就是答案。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
vector<int> g[20010];
int depth[20010],vis[20010];
int ans,start,maxdep;
void dfs(int u,int step){
ans = max(ans,step);
vis[u] = 1;
for(int i=0; i<g[u].size(); ++i){
int v = g[u][i];
if(!vis[v]){
dfs(v, step+1);
}
}
return ;
}
void init(){
memset(depth, 0,sizeof(depth));
memset(vis, 0, sizeof(vis));
ans = maxdep = 0;
depth[1] = 0;
}
int main(){
int n,m;
cin>>n>>m;
int cnt = 1;
for(int i=0; i<n-1; ++i){
int f;
scanf("%d",&f);
g[f].push_back(++cnt);
g[cnt].push_back(f);
depth[cnt] = depth[f] + 1;
if(depth[cnt] > maxdep){
maxdep = depth[cnt];
start = cnt;
}
}
for(int i =0; i<m; ++i){
int f;
scanf("%d",&f);
g[f].push_back(++cnt);
g[cnt].push_back(f);
depth[cnt] = depth[f] + 1;
if(depth[cnt] > maxdep){
maxdep = depth[cnt];
start = cnt;
}
}
dfs(start,0);
cout<<ans<<endl;
return 0;
}