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 }
View Code

相关文章: