题意:给一棵树,每个节点有一个权值,从中选一些点,相邻节点不能同时选,问能选的最大值是多少
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int dp[6010][2];
int a[6010];
int n;
vector<int> G[6010];
void dfs(int x, int fa){
dp[x][0] = 0;
dp[x][1] = a[x];
if(G[x].size() == 1 && G[x][0] == fa){
return;
}
//int sum = 0;
for(int i = 0; i<G[x].size(); i++){
int v = G[x][i];
if(v!=fa){
dfs(v, x);
dp[x][0] += max(dp[v][0], dp[v][1]);
dp[x][1] += dp[v][0];
}
}
}
int main(){
while(scanf("%d", &n)!=EOF){
memset(dp, 0, sizeof(dp));
for(int i = 0; i<6010; i++){
G[i].clear();
}
for(int i = 1; i<=n; i++){
scanf("%d", &a[i]);
}
int u, v;
while(scanf("%d %d", &u, &v) == 2 && u+v){
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1, 0);
cout<<max(dp[1][0], dp[1][1])<<endl;
}
return 0;
}