题 意:是最单纯的树形DP,只是结点会有不同的权值,但是处理情况简单。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=6001;
int val[N];
int n;
int dp[N][2];
vector<int> v[N];
bool vis[N];
void dfs(int i,int pre)
{
vis[i]=true;
int sum=0,sum1=0;
for (int j=0;j<v[i].size();j++)
{
int temp=v[i][j];
if (vis[temp]) continue;
dfs(temp,i);
sum += max(dp[temp][1],dp[temp][0]);
sum1 += dp[temp][0];
}
dp[i][0]=sum;
dp[i][1]=val[i]+sum1;
//cout<<i<<' '<<pre<<' '<<sum<<' '<<sum1<<' '<<dp[i][0]<<' '<<dp[i][1]<<endl;
}
int main()
{
freopen("in","r",stdin);
v[0].push_back(1);
while (scanf("%d",&n)!=EOF)
{
for (int i=1;i<=n;i++) scanf("%d",val+i),v[i].clear();
int a,b;
while (true)
{
scanf("%d%d",&a,&b);
if (!a) break;
// cout<<a<<' '<<b<<endl;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(0,0);
printf("%d\n",dp[0][0]);
memset(vis,false,sizeof(vis));
memset(dp,0,sizeof(dp));
//for (int i=0;i<=n;i++) cout<<dp[i][0]<<' '<<dp[i][1]<<endl;
}
}