树上DP求调
查看原帖
树上DP求调
921177
liuhaoyan0323楼主2024/9/28 16:40

NOIliunx2.0NOI-liunx 2.0上写的,一直段错误(核心已转储)求调.

code:

#include<bits/stdc++.h>
#define N 6005
#define int long long
using namespace std;
int n,x,y,root,happy[N],fa[N],dp[N][2];
vector<vector<int> > g;
inline void read(int &num){
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		f=(ch=='-')?-1:1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	num=x*f;
}
inline void dfs(int u){
	dp[u][0]=0;
	dp[u][1]=happy[u];
	for(auto i:g[u]){
		int v=g[u][i];
		dfs(v);
		dp[u][0]+=max(dp[v][0],dp[v][1]);
		dp[u][1]+=dp[v][0];
	}
}
signed main(){
	read(n);
	for(int i=1;i<=n;++i){
		read(happy[i]);
		fa[i]=i;
	}
	for(int i=1;i<=n;++i){
		read(x);
		read(y);
		fa[x]=y;
		g[y].push_back(x);
	}
	for(int i=1;i<=n;++i){
		if(fa[i]==i){
			root=i;
			break;
		}
	}
	dfs(root);
	printf("%lld",max(dp[root][0],dp[root][1]));
}

2024/9/28 16:40
加载中...