1. 程式人生 > 其它 >AcWing 3215. 網路延時(樹的直徑 + BFS + DFS + 樹形DP)

AcWing 3215. 網路延時(樹的直徑 + BFS + DFS + 樹形DP)

技術標籤:題解AcWingc++c語言

題目連結

給定一個公司的網路,由 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解釋

樣例的網路連線模式如下,其中圓圈表示交換機,方框表示電腦:

network1.png

其中電腦 1 與交換機 4 之間的訊息傳遞花費的時間最長,為 4 個單位時間。

輸入樣例2:

4 4
1 2 2
3 4 4 4

輸出樣例2:

4

樣例2解釋

樣例的網路連線模式如下:

**network2.png**

其中電腦 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; }