diff --git a/TangDou/Topic/HuanGenDp/P3478.cpp b/TangDou/Topic/HuanGenDp/P3478.cpp index 31370ad..37addb1 100644 --- a/TangDou/Topic/HuanGenDp/P3478.cpp +++ b/TangDou/Topic/HuanGenDp/P3478.cpp @@ -1,49 +1,53 @@ #include using namespace std; -const int N = 1000010; +const int N = 1000010, M = N << 1; #define int long long #define endl "\n" -struct edge { - int to, nxt; -} e[N << 1]; -int n, cnt, id; -int head[N]; +int n, id; +// 链式前向星 +int e[M], h[N], idx, w[M], ne[M]; +void add(int a, int b, int c = 0) { + e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; +} + int ans; int f[N], dep[N], size[N]; -inline void add(int u, int v) { - e[++cnt].nxt = head[u]; - head[u] = cnt; - e[cnt].to = v; -} -void dfs1(int x, int fa) { - size[x] = 1; - dep[x] = dep[fa] + 1; - for (int i = head[x]; i; i = e[i].nxt) { - int y = e[i].to; - if (y == fa) continue; - dfs1(y, x); - size[x] += size[y]; + +void dfs1(int u, int fa) { + size[u] = 1; + dep[u] = dep[fa] + 1; + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v == fa) continue; + dfs1(v, u); + size[u] += size[v]; } } -void dfs2(int x, int fa) { - for (int i = head[x]; i; i = e[i].nxt) { - int y = e[i].to; - if (y == fa) continue; - f[y] = f[x] + n - 2 * size[y]; - dfs2(y, x); +void dfs2(int u, int fa) { + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v == fa) continue; + f[v] = f[u] + n - 2 * size[v]; + dfs2(v, u); } } signed main() { + memset(h, -1, sizeof h); cin >> n; - for (int i = 1; i < n; i++) { - int u, v; - cin >> u >> v; - add(u, v), add(v, u); + for (int i = 1; i < n; i++) { // n-1条边 + int a, b; + cin >> a >> b; + add(a, b), add(b, a); // 换根DP,无向图 } + // 1、第一次dfs,找出:xxx dfs1(1, 0); + + // 2、换根 for (int i = 1; i <= n; i++) f[1] += dep[i]; dfs2(1, 0); + + // 3、找答案 for (int i = 1; i <= n; i++) if (ans < f[i]) ans = f[i], id = i; cout << id << endl;