1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 int son[6005],dp[6005][3],father[6005],f[6005][6005],a[6005]; 7 void dfs(int x) 8 { 9 if (son[x]==0){ 10 dp[x][0]=0; dp[x][1]=a[x]; 11 return; 12 } 13 dp[x][1]=a[x]; 14 dp[x][0]=0; 15 for (int i=1;i<=son[x];i++) 16 { 17 dfs(f[x][i]); 18 dp[x][1]+=dp[f[x][i]][0]; 19 dp[x][0]+=max(dp[f[x][i]][1],dp[f[x][i]][0]); 20 } 21 } 22 int main() 23 { 24 int n,i,j,x,y,sum; 25 while (~scanf("%d",&n)) 26 { 27 for (i=1;i<=n;i++) 28 scanf("%d",&a[i]); 29 memset(son,0,sizeof(son)); 30 memset(father,0,sizeof(father)); 31 while (~scanf("%d%d",&x,&y)&&x&&y) 32 { 33 son[y]++; 34 f[y][son[y]]=x; 35 father[x]=y; 36 } 37 for (i=1;i<=n;i++) 38 if (father[i]==0) dfs(i); 39 sum=0; 40 for (i=1;i<=n;i++) 41 if (father[i]==0) 42 sum+=max(dp[i][0],dp[i][1]); 43 printf("%d\n",sum); 44 } 45 }
转载于:https://www.cnblogs.com/xiao-xin/articles/4064004.html