poj 2342 Anniversary party

题目链接:http://poj.org/problem?id=2342

题意:读题很容易懂,这里不做介绍。

解法:树形DP之路的第一道题。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<cmath>

 6 #include<algorithm>

 7 #define inf 0x7fffffff

 8 using namespace std;

 9 const int maxn=6010;

10 int n;

11 int f[maxn][2],vis[maxn];

12 int father[maxn];

13 void dfs(int root)

14 {

15     vis[root]=1;

16     for (int i=1 ;i<=n ;i++)

17     {

18         if (!vis[i] && father[i]==root)

19         {

20             dfs(i);

21             f[root][0] += max(f[i][1],f[i][0]);

22             f[root][1] += f[i][0];

23         }

24     }

25 }

26 int main()

27 {

28     while (cin>>n)

29     {

30         memset(f,0,sizeof(f));

31         memset(vis,0,sizeof(vis));

32         for (int i=1 ;i<=n ;i++) father[i]=i;

33         for (int i=1 ;i<=n ;i++) cin>>f[i][1];

34         int a,b;

35         int root;

36         while (cin>>a>>b)

37         {

38             if (!a && !b) break;

39             father[a]=b;

40         }

41         for (int i=1 ;i<=n ;i++) if (father[i]==i) root=i;

42         dfs(root);

43         cout<<max(f[root][0],f[root][1])<<endl;

44     }

45     return 0;

46 }

 

你可能感兴趣的:(part)