60 pts wa#7,8,9,10 大佬求调
查看原帖
60 pts wa#7,8,9,10 大佬求调
779369
lijianqiao楼主2023/11/10 09:41
#include<bits/stdc++.h>
using namespace std;
#define int long long

int n;

struct node{
	int to,next;
}e[4000005];

int head[2000005],cnt,val[2000005],ans=0,tt;

void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}

int vis[2000005],mark1,mark2,t;

void dfs(int x,int fa){
	vis[x]=1;
	for(int i=head[x];i;i=e[i].next){
		int v=e[i].to;
		if(vis[v]==1&&t==0)mark1=v,mark2=x,t=1;
		if(v!=fa&&vis[v]==0)dfs(v,x);
	}
}

int f[2000005][2],vis2[2000005];

void dp(int x,int fa,int mark){
	vis2[x]=mark;
	f[x][0]=0;
	f[x][1]=val[x];
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].to;
		if(y==fa||vis2[y]==mark){
			continue;
		}
		dp(y,x,mark);
  		f[x][0]+=max(f[y][0],f[y][1]);
  		f[x][1]+=f[y][0];
 	}
}

signed main(){
    int yy;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		int pp;
		scanf("%lld%lld",&val[i],&pp);
		add(i,pp),add(pp,i);
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==0){
		    ans=0;
			t=0;
			dfs(i,0);
			dp(mark1,0,++yy);
			ans=max(ans,f[mark1][0]);
			dp(mark2,0,++yy);
			ans=max(ans,f[mark2][0]);
			tt+=ans;
		}
	}
	printf("%lld",tt);
	return 0;
}
2023/11/10 09:41
加载中...