天天看點

第四次CCF計算機軟體能力認證 網絡延時(樹的直徑)

給定一個公司的網絡,由 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;
}