#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 1e9;
const int N = 1e6+100;
void read (int &x) {
int f = 1;x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') { x = x*10+ch-'0'; ch = getchar();}
x *= f;
}
void print (int x) {
if (x<0) putchar('-'), x = -x;
if (x<10) putchar(x+'0');
else print(x/10), putchar(x%10+'0');
}
struct R {
int u, v, lst;
}road[N<<1];
int n, x1, x2, tot, ed, final[N];
ll dp[N][3], power[N];
bool vis[N];
void add (ll u, ll v) { road[tot].u = u, road[tot].v = v, road[tot].lst = final[u], final[u] = tot++; }
void find (int now, int fa) {
vis[now] = true;
for (int i = final[now];~i;i = road[i].lst) {
if ((i^1) == fa) continue;
if (vis[road[i].v]) {
x1 = now, x2 = road[i].v, ed = i;
continue;
}
find(road[i].v, i);
}
}
void dfs (int now, int fa) {
dp[now][0] = 0;
dp[now][1] = power[now];
for (int i = final[now];~i;i = road[i].lst) {
int v = road[i].v;
if ((i^1) == fa) continue;
if (i == ed || (i^1) == ed) continue;
dfs(v, i);
dp[now][1] += dp[v][0];
dp[now][0] += max(dp[v][1], dp[v][0]);
}
}
int main () {
//freopen("xxx.in", "r", stdin);
//freopen("xxx.out", "w", stdout);
read(n);
memset(final, -1, sizeof final);
for (int i = 1;i <= n;i++) {
int a, b;
read(a), read(b);
add(i, b), add(b, i), power[i] = a*1ll;
}
ll ans = 0;
for (int i =1 ;i <= n;i++) {
if (vis[i]) continue;
find(i, -1);
dfs(x1, -1);
ll a = dp[x1][0];
dfs(x2, -1);
ll b = dp[x2][0];
ans += max(a, b);
}
printf("%lld\n", ans);
return 0;
}
我的 add 函数和 final 本来是 :
void add (int u, int v) { road[++tot].u = u, road[tot].v = v, road[tot].lst = final[u], final[u] = tot; }
memset(final, 0, sizeof(final));
然后在枚举边的时候也不是 for(int i = final[now];~i;i = road[i].lst)
而是 for(int i = final[now];i;i = road[i].lst)
调用 find 和 dfs 时也不是 find(i, -1)
和 dfs(x1/x2, -1)
而是 find(i, 0)
和 dfs(x1/x2, 0)
可是如果这样的话就会在 dfs 函数那里死循环,改成上面完整代码的样子就可以,请问是为什么,萌新求助QWQ