codevs1380 没有丧尸的舞会

时间:2023-03-09 04:30:21
codevs1380 没有丧尸的舞会
/*
树形DP 而然我并不知道树在哪(....)
f[x][0]表示x节点不参加舞会 以x为根的子树的最优解
f[x][1]表示x节点参加舞会 以x为根的子树的最优解
方程为:(so为x的儿子 so要枚举一下)
f[x][0]+=max(f[so][0],f[so][1]);
f[x][1]+=f[so][0];
初始化 f[i][1]= 输入的happy值
最后比较 max(f[i][0],f[i][1]) i为根
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 6010
using namespace std;
int f[maxn][],son[maxn][maxn],n,fa[maxn],x,y;
void Dfs(int x)
{
for(int i=;i<=son[x][son[x][]];i++)
{
int so=son[x][i];
Dfs(so);
f[x][]+=max(f[so][],f[so][]);
f[x][]+=f[so][];
}
}
int main()
{
scanf("%d",&n);
int i,j;
for(i=;i<=n;i++)
{
scanf("%d",&f[i][]);
fa[i]=i;
}
while()
{
scanf("%d%d",&x,&y);
if(x==&&y==)break;
son[y][++son[y][]]=x;
fa[x]=y;
}
for(i=;i<=n;i++)
if(fa[i]==i)
{
Dfs(i);
printf("%d\n",max(f[i][],f[i][]));
}
return ;
}