并查集20分,求助
查看原帖
并查集20分,求助
559506
BestFriend楼主2022/11/4 13:50
#include<bits/stdc++.h>
using namespace std;  
int n,m,x,y,root,fa[114514],value[114514];
int head[114514],dp[114514][2];
struct node{
	int v,u,next;
}edge[114514];
void dfs(int u){
	for(int i=head[u];i;i=edge[i].next){//u的孩子 
		int v=edge[i].v;
		dfs(v); 
		dp[u][0]+=max(dp[v][0],dp[v][1]);
		dp[u][1]+=dp[v][0]; 
	}
}
int cnt=0;
void add(int u,int v){
	edge[++cnt].v=v;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&value[i]);
		dp[i][1]=value[i];
	}
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	while(cin>>x>>y){
		fa[x]=y;
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		if(fa[i]==i){
			root=i;
			break;
		}
	}
	dfs(root);
	dp[root][0]=0;
	dp[root][1]=value[1];
	cout<<max(dp[root][0],dp[root][1])<<endl;
	return 0;
} 
2022/11/4 13:50
加载中...