题目链接: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 }