开来帮我康康
查看原帖
开来帮我康康
311502
逸之为一楼主2021/4/19 21:35
#include<bits/stdc++.h>
using namespace std;
struct node{ //链式前向
	int v,next;
}edge[6010];
long long dp[6010][2];
int box[6010],ecnt=1;
bool vis[6010];
int w[6010];
int n,a,b,TLE=(1<<30)-1;
void addedge(int u,int v){ 
	edge[ecnt].v=v;
	edge[ecnt].next=box[u];
	box[u]=ecnt++; //建边
}
void dfs(int x){
	dp[x][0]=w[x];
	dp[x][1]=dp[x][2]=0;
	for(int i=box[x];i!=0;i=edge[i].next){
		int u=edge[i].v;
		if(!vis[u]){
			vis[u]=1;
			dfs(u);
			dp[u][0]+=max(dp[u][0],dp[u][1]);
			dp[u][1]+=dp[u][0]; //动态转移方程
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n-1;i++){
		cin>>a>>b;
		addedge(a,b); addedge(b,a); //存无向边
	}
	vis[1]=1;
	dfs(1);
	cout<<min(dp[1][0],dp[1][1])<<endl; //输出
	return 0;
}
2021/4/19 21:35
加载中...