輸入樣例:
7
1
1
1
1
1
1
1
1 3
7 4
2 3
4 5
6 4
3 5
0 0
輸出樣例:
5
(雖然題目說的多組數據,但我試了下實際上只有一組數據。。。)
f[i][0]表示第i個人不去時最大的快樂值,f[i][1]表示第i個人去時最大的快樂值。
轉移方程:
f[i][0]+=max(f[j][0],f[j][1]),如果第i個人不去,那麼他的下屬,第j個人,可能去也可能不去
f[i][1]+=f[y][0],如果第i個人去,那麼他的下屬都不能去
完整代碼:
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int N;
int happy[6100];
int f[6100][2];
int pa[6100];
vector<int> tree[6100];
void dfs(int x)
{
f[x][0]=0;
f[x][1]=happy[x];
for(int i=0;i<tree[x].size();i++)
{
int y=tree[x][i];
dfs(tree[x][i]);
f[x][0]+=max(f[y][1],f[y][0]);
f[x][1]+=f[y][0];
}
}
int main()
{
cin>>N;
int a,b;
memset(happy,0,sizeof(0));
memset(pa,0,sizeof(0));
for(int i=1;i<=N;i++)
{
cin>>happy[i];
}
for(int i=1;i<=N-1;i++)
{
cin>>a>>b;
tree[b].push_back(a);
pa[a]=1;
}
int root;
for(int i=1;i<=N;i++)
{
if(pa[i]!=1)
root=i;
}
dfs(root);
cout<<max(f[root][0],f[root][1])<<endl;
}