Replay
Dup4:
- 啥都不会? 只能看着两位聚聚A题?
X:
- 模拟题不会写, 日常摔锅
- u, v分不清, 日常演员
- 又是自己没理清楚就抢键盘上机导致送了一万个罚时, 日常背锅
A:迷宫
Solved.
考虑所有人从1号点排队出发,所有人都回到自己位置的时间
让深度大的先走,这样就不会产生堵塞
那么每个人的时间就是 在1号点的等待时间+深度
取最大值即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 #define N 100010 5 int n, a[N]; 6 vector <int> G[N]; 7 8 int deep[N], fa[N]; 9 void DFS(int u) 10 { 11 for (auto v : G[u]) if (v != fa[u]) 12 { 13 deep[v] = deep[u] + 1; 14 fa[v] = u; 15 DFS(v); 16 } 17 } 18 19 int main() 20 { 21 while (scanf("%d", &n) != EOF) 22 { 23 for (int i = 1; i <= n; ++i) G[i].clear(); 24 for (int i = 1; i <= n; ++i) scanf("%d", a + i); 25 for (int i = 1, u, v; i < n; ++i) 26 { 27 scanf("%d%d", &u, &v); 28 G[u].push_back(v); 29 G[v].push_back(u); 30 } 31 deep[1] = 0; DFS(1); 32 vector <int> vec; 33 for (int i = 1; i <= n; ++i) if (a[i]) vec.push_back(i); 34 sort(vec.begin(), vec.end(), [](int a, int b) { return deep[a] > deep[b]; }); 35 int res = 0; 36 int cnt = 0; 37 for (auto it : vec) 38 { 39 res = max(res, cnt + deep[it]); 40 ++cnt; 41 } 42 printf("%d\n", res); 43 } 44 return 0; 45 }