網絡延時
問題描述
給定一個公司的網絡,由n台交換機和m台終端電腦組成,交換機與交換機、交換機與電腦之間使用網絡連接。交換機按層級設置,編號為1的交換機為根交換機,層級為
1。他的交換機都連接到一台比自己上一層的交換機上,其層級為對應交換機的層級加1。所有的終端電腦都直接連接到交換機上。
當信息在電腦、交換機之間傳遞時,每一步只能通過自己傳遞到自己所連接的另一台電腦或交換機。請問,電腦與電腦之間傳遞消息、或者電腦與交換機之間傳遞消息、
當信息在電腦、交換機之間傳遞時,每一步只能通過自己傳遞到自己所連接的另一台電腦或交換機。請問,電腦與電腦之間傳遞消息、或者電腦與交換機之間傳遞消息、
或者交換機與交換機之間傳遞消息最多需要多少步。
輸入格式
輸入的第一行包含兩個整數n, m,分別表示交換機的台數和終端電腦的台數。
第二行包含n - 1個整數,分別表示第2、3、……、n台交換機所連接的比自己上一層的交換機的編號。第i台交換機所連接的上一層的交換機編號一定比自己的編號小。
第三行包含m個整數,分別表示第1、2、……、m台終端電腦所連接的交換機的編號。
第二行包含n - 1個整數,分別表示第2、3、……、n台交換機所連接的比自己上一層的交換機的編號。第i台交換機所連接的上一層的交換機編號一定比自己的編號小。
第三行包含m個整數,分別表示第1、2、……、m台終端電腦所連接的交換機的編號。
輸出格式
輸出一個整數,表示消息傳遞最多需要的步數。
樣例輸入
4 2
1 1 3
2 1
1 1 3
2 1
樣例輸出
4
樣例說明
樣例的網絡連接模式如下,其中圓圈表示交換機,方框表示電腦:
其中電腦1與交換機4之間的消息傳遞花費的時間最長,為4個單位時間。

其中電腦1與交換機4之間的消息傳遞花費的時間最長,為4個單位時間。
樣例輸入
4 4
1 2 2
3 4 4 4
1 2 2
3 4 4 4
樣例輸出
4
樣例說明
樣例的網絡連接模式如下:
其中電腦1與電腦4之間的消息傳遞花費的時間最長,為4個單位時間。

其中電腦1與電腦4之間的消息傳遞花費的時間最長,為4個單位時間。
評測用例規模與約定
前30%的評測用例滿足:n ≤ 5, m ≤ 5。
前50%的評測用例滿足:n ≤ 20, m ≤ 20。
前70%的評測用例滿足:n ≤ 100, m ≤ 100。
所有評測用例都滿足:1 ≤ n ≤ 10000,1 ≤ m ≤ 10000
前50%的評測用例滿足:n ≤ 20, m ≤ 20。
前70%的評測用例滿足:n ≤ 100, m ≤ 100。
所有評測用例都滿足:1 ≤ n ≤ 10000,1 ≤ m ≤ 10000
簡單題、不知道為什么考試的時候只得了80分,= =
重寫了一下 100分
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> using namespace std; #define INF 0x3f3f3f3f #define ll long long #define N 200010 #define M 10*N struct Edge{ int to,next; }edge[M]; int tot; int head[N]; int n,m; int dp[N][2]; void init() { tot=0; memset(head,-1,sizeof(head)); } void add(int u,int v) { edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++; } void dfs(int u) { dp[u][0]=dp[u][1]=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; dfs(v); if(dp[v][0]+1>=dp[u][0]){ dp[u][1]=dp[u][0]; dp[u][0]=dp[v][0]+1; } else if(dp[v][0]+1>dp[u][1]) dp[u][1]=dp[v][0]+1; } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=2;i<=n;i++){ int x; scanf("%d",&x); add(x,i); } for(int i=1;i<=m;i++){ int x; scanf("%d",&x); add(x,i+n); } dfs(1); int ans=0; for(int i=1;i<=n+m;i++) ans=max(ans,dp[i][0]+dp[i][1]); printf("%d\n",ans); } return 0; }