1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <bits/stdc++.h> using namespace std;
const int N = 2e5 + 10; vector<int> adj[N]; int f1[N], f2[N], cho[N], up[N];
void dfs1(int u, int fa) { for (int v : adj[u]) { if (v == fa) continue; dfs1(v, u); int d = f1[v] + 1; if (d > f1[u]) { f2[u] = f1[u]; f1[u] = d; cho[u] = v; } else if (d > f2[u]) { f2[u] = d; } } }
void dfs2(int u, int fa) { for (int v : adj[u]) { if (v == fa) continue; if (v == cho[u]) { up[v] = max(up[u], f2[u]) + 1; } else { up[v] = max(up[u], f1[u]) + 1; } dfs2(v, u); } }
int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); }
dfs1(1, 0); dfs2(1, 0);
for (int i = 1; i <= n; ++i) { cout << max(f1[i], up[i]) << (i == n ? "" : " "); } return 0; }
|