求助,理论上是对的,但不知为何错误
查看原帖
求助,理论上是对的,但不知为何错误
181566
after_the_end楼主2020/9/3 20:24
#include<bits/stdc++.h>
using namespace std;
#define re register
long long n,val[1000001],f1[1000001][2],f2[1000001][2],head[1000001],tot,rt1,rt2,ans,temp;
bool flag1[1000001],flag[1000001],flag2[1000001];
struct node{
	int next,to;
}edge[2000001];
inline void addedge(int u,int v){
	edge[++tot].next=head[u];
	edge[tot].to=v;
	head[u]=tot;
}
void dp1(int now,int fa){
	flag1[now]=1;
	for(re int i=head[now];i;i=edge[i].next){
		if(!flag1[edge[i].to]){
			dp1(edge[i].to,now);
			f1[now][1]+=f1[edge[i].to][0];
			f1[now][0]+=max(f1[edge[i].to][1],f1[edge[i].to][0]);
		}
	}
}
void dp2(int now,int fa){
	flag2[now]=1;
	for(re int i=head[now];i;i=edge[i].next){
		if(!flag2[edge[i].to]){
			dp2(edge[i].to,now);
			f2[now][1]+=f2[edge[i].to][0];
			f2[now][0]+=max(f2[edge[i].to][1],f2[edge[i].to][0]);
		}
	}
}
void dfs(int now,int fa){
	flag[now]=1;
	for(re int i=head[now];i;i=edge[i].next){
		if(!flag[edge[i].to]){
			dfs(edge[i].to,now);
		}
		else if(fa==edge[i].to)continue;
		else{
			rt1=now;
			rt2=edge[i].to;
			dp1(rt1,-1);
			dp2(rt2,-1);
			ans+=max(f1[rt1][0],f2[rt2][0]);
		}
	}
}
int main(){
	scanf("%d",&n);
	int num;
	for(re int i=1;i<=n;++i){
		scanf("%d%d",&val[i],&num);
		f1[i][1]=f2[i][1]=val[i];
		addedge(num,i);
		addedge(i,num);
	}
	for(re int i=1;i<=n;++i){
		if(!flag[i]){
			dfs(i,-1);
		}
	}
	printf("%lld",ans);
}
2020/9/3 20:24
加载中...