POJ2342

#include<iostream>

using namespace std;

const int M = 6010;
int V[M][2];
int fa[M];
int n;
int Max(int a,int b)
{
  return a>b?a:b;
}

void calculator(int node)
{
  int i;
  for(i=1;i<=n;i++)
  {
    if(fa[i]==node)
    {
      calculator(i);
      V[node][1]+=V[i][0];
      V[node][0]+=Max(V[i][0],V[i][1]);
    }
  }
}

int main()
{
  int i,root;cin>>n;
  for(i=1;i<=n;i++)
  {
     cin>>V[i][1];V[i][0]=0;fa[i]=0;
  }
  int a,b;
  while(cin>>a>>b)
  {
    if(a==0&&b==0)
      break;
     fa[a]=b;
  }
  for(i=1;i<=n;i++)
  {
    if(fa[i]==0)
    {
      root=i;break;
    }
  }
  calculator(root);
  cout<<Max(V[root][0],V[root][1])<<endl;
  return 0;
}

posted @ 2013-04-08 11:46  algorithms爱好者  阅读(107)  评论(0)    收藏  举报