OJ题目 : 点这里~
大概题意:树中每个节点都有一个数字 , 选择节点 ,使得数字和最大 , 而且父节点和子节点不能同时被选。
#define go 0
#define notgo 1
#define Max_N 6008
using namespace std;
typedef long long LL;
int dp[Max_N][2];
vector<int> List[Max_N];
int n;
void dfs(int u , int father)
{
int i , v;
for(i = 0;i < List[u].size();i++)
{
v = List[u][i];
if(v == father)
continue;
dfs(v , u);
dp[u][go] += dp[v][notgo];
dp[u][notgo] += Max(dp[v][go] , dp[v][notgo]);
}
}
int main()
{
while(scanf("%d",&n) != EOF)
{
int i , x , y;
memset(dp , 0 , sizeof(dp));
for(i = 1;i <= n;i++)
{
List[i].clear();
scanf("%d",&dp[i][go]);
}
while(scanf("%d%d",&x , &y)&&(x||y))
{
List[y].push_back(x);
List[x].push_back(y);
}
dfs(1,-1);
cout << Max(dp[1][go] , dp[1][notgo]) << endl;
}
return 0;
}
关于本题 ,推荐看高人的博文,猛戳~~