60求助
查看原帖
60求助
1244320
Delayed楼主2024/8/13 10:31
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,happy[N];//快乐值
int f[N][3];
int a[N][N];//y的邻接点 后表示个数;
int b[N];//个数
bool fa[1005];//是否有父亲节点

void dfs(int u)
{
	f[u][1]=happy[u];
	for(int i=0;i<b[u];i++)
	{
		int son=a[u][i];//u的子节点
		dfs(son);
		f[u][0]+=max(f[son][0],f[son][1]);//祖先不加入,父亲节点可加入可不加入
		f[u][1]+=f[son][0];//祖先节点加入,对应的父亲节点舍去
	}
	
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>happy[i];
	for(int i=0;i<n-1;i++)
	{
		int x,y;
		cin>>x>>y;
		a[y][b[y]++]=x;
		//把y的邻接点x存到数组a;
		//y的邻接点的个数存到b数组
		fa[x]=true;
	}
	int root=1;
	while(fa[root])root++;//祖先根遍历到孙子根节点
	dfs(root);
	cout<<max(f[root][1],f[root][0]);
	return 0;
}
2024/8/13 10:31
加载中...