//P2607
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int Head[N], Edge[N*2], Next[N*2], tot;
long long Wegt[N], ans, dp[2][N][2];
int n, fa[N], inl[N][2], cnt;
int gf(int x){ return x == fa[x] ? x : fa[x] = gf(fa[x]); }
void dfs(int x, int fa, int k, int op){
if(x == k){ dp[op][x][1] = -0x7fffffffffffffff; return; }
dp[op][x][0] = 0, dp[op][x][1] = Wegt[x];
for(int i = Head[x]; i; i = Next[i]){
int y = Edge[i];
if(y == fa || y == k) continue;
dfs(y, x, k, op);
dp[op][x][1] += dp[op][y][0];
dp[op][x][0] += max(dp[op][y][0], dp[op][y][1]);
}
}
int main(){
for(int i = 0; i < N; ++ i) fa[i] = i;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
int x;
scanf("%lld%d", &Wegt[i], &x);
if(gf(x) == gf(i)){
inl[++cnt][0] = x, inl[cnt][1] = i;
} else {
fa[gf(x)] = gf(i);
Edge[++tot] = i, Next[tot] = Head[x], Head[x] = tot;
Edge[++tot] = x, Next[tot] = Head[i], Head[i] = tot;
}
}
for(int i = 1; i <= cnt; ++ i){
int x = inl[cnt][0], y = inl[cnt][1];
long long tmp = 0;
dfs(x, 0, y, 0), tmp = max(dp[0][x][0], dp[0][x][1]);
dfs(y, 0, x, 1), tmp = max(tmp, max(dp[1][y][0], dp[1][y][1]));
ans += tmp;
printf("%lld\n", tmp);//调试用语句,提交时删掉了
}
printf("%lld\n", ans);
return 0;
}
试一下这两组数据:
4
2 2
3 1
2 4
3 3
4
2 2
3 1
2 4
4 3
这是为什么?