給定一個公司的網絡,由 n 台交換機和 m 台終端電腦組成,交換機與交換機、交換機與電腦之間使用網絡連接配接。
交換機按層級設定,編号為 1 的交換機為根交換機,層級為 1。
其他的交換機都連接配接到一台比自己上一層的交換機上,其層級為對應交換機的層級加 1。
所有的終端電腦都直接連接配接到交換機上。
當資訊在電腦、交換機之間傳遞時,每一步隻能通過自己傳遞到自己所連接配接的另一台電腦或交換機。
請問,電腦與電腦之間傳遞消息、或者電腦與交換機之間傳遞消息、或者交換機與交換機之間傳遞消息最多需要多少步。
輸入格式
輸入的第一行包含兩個整數 n,m,分别表示交換機的台數和終端電腦的台數。
第二行包含 n−1 個整數,分别表示第 2、3、……、n 台交換機所連接配接的比自己上一層的交換機的編号。第 ii 台交換機所連接配接的上一層的交換機編号一定比自己的編号小。
第三行包含 m 個整數,分别表示第 1、2、……、m 台終端電腦所連接配接的交換機的編号。
輸出格式
輸出一個整數,表示消息傳遞最多需要的步數。
資料範圍
前 30%30% 的評測用例滿足:n≤5,m≤5。
前 50%50% 的評測用例滿足:n≤20,m≤20。
前 70%70% 的評測用例滿足:n≤100,m≤100。
所有評測用例都滿足:1≤n≤10000,1≤m≤10000。
輸入樣例1:
4 2
1 1 3
2 1
輸出樣例1:
4
#include<bits/stdc++.h>
using namespace std;
const int N=20010,M=N;
int e[M],ne[M],h[N],idx;
int n,m;
int ans;//記錄最終值
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u)
{
int d1=0,d2=0;
for(int i=h[u];~i;i=ne[i]){
int t=e[i];
int d=dfs(t)+1;
if(d>d1){
d2=d1;
d1=d;
}
else if(d>d2){
d2=d;
}
}
ans=max(ans,d1+d2);
return d1;
}
int main ()
{
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=2;i<=n;i++){
int x;
scanf("%d",&x);
add(x,i);
}
for(int i=1;i<=m;i++){//電腦編号為n+i
int x;
scanf("%d",&x);
add(x,n+i);
}
dfs(1);
cout<<ans<<endl;
return 0;
}