80pts求调
查看原帖
80pts求调
1708023
LIANGMINGY楼主2025/7/29 14:37
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int>w;
int n,x,y,ss,sum[6001],a[6001],f[6001],dp[6001];
bool b[6001],bb[6001],c[6001];
void ff(int o) {
	for(int i=1; i<=sum[o]; i++) {
		int u=w[ {o,i}];
		for(int j=1; j<=sum[u]; j++) {
			int uu=w[ {u,j}];
			if(!c[uu])c[uu]=1,ff(uu);
			dp[o]+=dp[uu];//直接加上孙子的值 
		}
	}
	for(int i=1; i<=sum[o]; i++) {
		int u=w[ {o,i}];
		if(!c[u])c[u]=1,ff(u);
		dp[o]=max(dp[o],dp[u]);
	}
	return;
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++)f[i]=i;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
		if(a[i]<0)a[i]=0;
	}
	for(int i=1; i<=n; i++)dp[i]=a[i];
	for(int i=1; i<n; i++){
		cin>>x>>y;
		w[ {y,++sum[y]}]=x;//将x设为y的儿子 
		f[x]=y;//将y设为x的爸爸
		b[x]=1;//给儿子打上标记,方便求根 
	}
	for(int i=1;i<=n;i++){
		if(!b[i]){
			ff(i);
			ss+=dp[i];
		}
	}
	cout<<ss;
}
2025/7/29 14:37
加载中...