树形dp50pts求调
查看原帖
树形dp50pts求调
776337
sugawara楼主2024/7/15 15:35

code:

#include<iostream>
#include<math.h>
using namespace std;
const int N=6e3+10;
int n,l,k,dp[N][5];
int top,head[N];
bool vis[N],dep[N];
struct edge{int nxt,v;}eg[N];
void build(int u,int v){eg[++top].v=v,eg[top].nxt=head[u],head[u]=top;}
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
	return f==1?x:-x;
}
void solves(int u){
	vis[u]=1;
	for(int i=head[u];i;i=eg[i].nxt){
		int v=eg[i].v;if(vis[v]) continue;
		solves(v);dp[u][1]+=dp[v][0];
		dp[u][0]=max(dp[v][0],dp[v][1]);
	}
}
int main(){
	n=read();
	for(int i=1;i<=n;i++) dp[i][1]=read();
	for(int i=1;i<n;i++) l=read(),k=read(),dep[l]=1,build(k,l);
	for(int i=1;i<=n;i++){
		if(!dep[i]){
			solves(i);
			printf("%d",max(dp[i][0],dp[i][1]));
			return 0;
		}
	}	
	return 0;
}
2024/7/15 15:35
加载中...