| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 4810 | Accepted: 2724 |
Description
Input
Output
Sample Input
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
0 0
Sample Output
5
Source
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int const MAX = 6005;
int dp[MAX][2], val[MAX];
bool vis[MAX], flag[MAX];
vector <int> vt[MAX];
void DFS(int fa)
{
vis[fa] = true;
dp[fa][1] = val[fa];
int sz = vt[fa].size();
for(int i = 0; i < sz; i++)
{
int son = vt[fa][i];
if(!vis[son])
{
DFS(son);
dp[fa][1] += dp[son][0];
dp[fa][0] += max(dp[son][1], dp[son][0]);
}
}
return;
}
int main()
{
int n;
while(scanf("%d", &n) && n)
{
for(int i = 1; i <= n; i++)
vt[i].clear();
memset(flag, false, sizeof(flag));
memset(vis, false, sizeof(vis));
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
scanf("%d", &val[i]);
for(int i = 0; i < n - 1; i++)
{
int a, b;
scanf("%d %d", &a, &b);
vt[b].push_back(a);
flag[a] = true;
}
int root;
for(int i = 1; i <= n; i++) //n个点n-1条边,必然存在“入度”为0的点即树根
{
if(!flag[i])
{
root = i;
break;
}
}
DFS(root);
printf("%d\n", max(dp[root][1], dp[root][0]));
}
}POJ 2342 Anniversary party (树形dp 入门题)
原文地址:http://blog.csdn.net/tc_to_top/article/details/45021113