AcWing 3215. 網路延時(樹的直徑 + BFS + DFS + 樹形DP)
阿新 • • 發佈:2021-02-19
給定一個公司的網路,由 n 臺交換機和 m 臺終端電腦組成,交換機與交換機、交換機與電腦之間使用網路連線。
交換機按層級設定,編號為 1 的交換機為根交換機,層級為 1。
其他的交換機都連線到一臺比自己上一層的交換機上,其層級為對應交換機的層級加 1。
所有的終端電腦都直接連線到交換機上。
當資訊在電腦、交換機之間傳遞時,每一步只能通過自己傳遞到自己所連線的另一臺電腦或交換機。
請問,電腦與電腦之間傳遞訊息、或者電腦與交換機之間傳遞訊息、或者交換機與交換機之間傳遞訊息最多需要多少步。
輸入格式
輸入的第一行包含兩個整數 n,m,分別表示交換機的臺數和終端電腦的臺數。
第二行包含 n−1 個整數,分別表示第 2、3、……、n 臺交換機所連線的比自己上一層的交換機的編號。第 i 臺交換機所連線的上一層的交換機編號一定比自己的編號小。
第三行包含 m 個整數,分別表示第 1、2、……、m 臺終端電腦所連線的交換機的編號。
輸出格式
輸出一個整數,表示訊息傳遞最多需要的步數。
資料範圍
前 30% 的評測用例滿足:n≤5,m≤5。
前 50% 的評測用例滿足:n≤20,m≤20。
前 70% 的評測用例滿足:n≤100,m≤100。
所有評測用例都滿足:1≤n≤10000,1≤m≤10000。
輸入樣例1:
4 2
1 1 3
2 1
輸出樣例1:
4
樣例1解釋
樣例的網路連線模式如下,其中圓圈表示交換機,方框表示電腦:
其中電腦 1 與交換機 4 之間的訊息傳遞花費的時間最長,為 4 個單位時間。
輸入樣例2:
4 4
1 2 2
3 4 4 4
輸出樣例2:
4
樣例2解釋
樣例的網路連線模式如下:
其中電腦 1 與電腦 4 之間的訊息傳遞花費的時間最長,為 4 個單位時間。
思路:
樹的最長路徑模板題
答案:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-6
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 2e6 + 10;
const int M = 1111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;
int e[N] , ne[N] , h[N] , idx;
int f[N];
int n , m , ans;
void add(int a , int b){
e[idx] = b ;
ne[idx] = h[a] ;
h[a] = idx++;
}
void DFS(int u){
int a = 0 , b = 0;
for(int i = h[u] ; ~i ; i = ne[i]){
int j = e[i];
DFS(j);
int t = f[j] + 1;
if(t >= a)
b = a , a = t;
else if(t > b)
b = t;
}
f[u] = a;
ans = max(ans , a + b);
}
void solve(){
cin >> n >> m;
memset(h , -1 , sizeof h);
for(int i = 2 ; i <= n + m ; i++){
int j;
cin >> j;
add(j , i);
}
DFS(1);
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}