【CCF】网络延时 树搜索
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=2e4+2; const int maxm=2e4+2; const int inf=0x3f3f3f3f; int n,m; struct edge{ int to; int nxt; }e[2*maxm]; int len[maxn][2]; bool vis[maxn]; int tot; int head[maxn]; int ans=-inf; void init(){ memset(head,-1,sizeof(head)); tot=0; memset(len,0,sizeof(len)); memset(vis,false,sizeof(vis)); } void add(int u,int v){ e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } void dfs(int u){ vis[u]=true; vector<int> vec; for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(vis[v]) continue; dfs(v); int tmp=len[v][0]+1; vec.push_back(tmp); } int sz=vec.size(); if(sz==0){ len[u][0]=len[u][1]=0; }else if(sz==1){ len[u][0]=vec[0]; len[u][1]=0; }else{ int pos1=-1,pos2=-1; for(int i=0;i<sz;i++){ if(vec[i]>len[u][0]){ len[u][0]=vec[i]; pos1=i; } } for(int i=0;i<sz;i++){ if(i==pos1) continue; if(vec[i]>len[u][1]){ len[u][1]=vec[i]; } } ans=max(ans,len[u][0]+len[u][1]); } } int work(){ dfs(1); return ans; } int main(){ while(~scanf("%d%d",&n,&m)){ init(); int x; for(int i=2;i<=n;i++){ scanf("%d",&x); add(i,x); add(x,i); } for(int i=1;i<=m;i++){ scanf("%d",&x); add(n+i,x); add(x,n+i); } int ans=work(); printf("%d\n",ans); } return 0; }