奇妙爆0
查看原帖
奇妙爆0
390770
S0CRiA楼主2021/8/21 18:58
//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

这是为什么?

2021/8/21 18:58
加载中...