第6个样例, n 是 500000 ,下载下来本地跑也跑不出答案,是需要手写栈吗?我看评论区都没有手写栈,也复制了第一篇的代码在本地跑,一样出不了答案
#include <iostream>
using namespace std;
#define MAX_N 1000005
#define ll long long
int idle = 1;
int head[MAX_N] = { 0 }, nex[MAX_N * 2] = { 0 };
int edge[MAX_N * 2] = { 0 };
void add(int u, int v) {
nex[idle] = head[u];
head[u] = idle;
edge[idle] = v;
idle++;
}
// 0 下 1 上
ll dp[MAX_N][2] = { 0 };
ll child[MAX_N][2] = { 0 };
void dfs1(int u, int fa) {
for (int ind = head[u]; ind; ind = nex[ind]) {
int v = edge[ind];
if (v == fa) continue;
dfs1(v, u);
child[u][0] += child[v][0];
dp[u][0] += dp[v][0] + child[v][0];
}
child[u][0]++;
}
void dfs2(int u, int fa) {
child[u][1] = child[fa][1] + (child[fa][0] - child[u][0]);
dp[u][1] = dp[fa][1] + (dp[fa][0] - dp[u][0] - child[u][0])
+ child[fa][1] + (child[fa][0] - child[u][0]);
for (int ind = head[u]; ind; ind = nex[ind]) {
int v = edge[ind];
if (v == fa) continue;
dfs2(v, u);
}
}
int main() {
int n;
scanf("%d", &n);
for (int x = 1; x < n; x++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v), add(v, u);
}
dfs1(1, 0);
for (int ind = head[1]; ind; ind = nex[ind])
dfs2(edge[ind], 1);
int mx = 0, ans = 1;
for (int x = 1; x <= n; x++)
if (dp[x][0] + dp[x][1] > mx) {
mx = dp[x][0] + dp[x][1];
ans = x;
}
printf("%d", ans);
return 0;
}