用了dp和dfs,构建树的方法不熟练,dfs写的也较少
----------------------------------------------------------------------------------------
#include<string.h>
#include<stdio.h>
#define N 6005
#define max(a,b) a>b?a:b
struct node{
int from,to,next;
};
node edges[N*2];
int val[N],tol;
int head[N],degree[N],dp[N][2],visit[N];
int n;
void Add(int a,int b)
{
edges[tol].from=a;edges[tol].to=b;
edges[tol].next=head[a];
head[a]=tol++;
}
void dfs(int x)
{
visit[x]=0;
int ans0,ans1;
int j,u;
ans1=ans0=0;
for(j=head[x];j!=-1;j=edges[j].next)
{
u=edges[j].to;
if(!visit[u]) dfs(u);
ans0+=max(dp[u][1],dp[u][0]);
ans1+=dp[u][0];
}
dp[x][1]=ans1+val[x];
dp[x][0]=ans0;
}
int main()
{
int i,a,b,sum;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++) scanf("%d",&val[i]);
memset(head,-1,sizeof(head));
memset(degree,0,sizeof(degree));
tol=0;
while(scanf("%d%d",&a,&b) && a+b)
{
Add(b,a);
degree[a]++;
}
memset(dp,0,sizeof(dp));
memset(visit,0,sizeof(visit));
sum=0;
for(i=1;i<=n;i++)
{
if(degree[i]==0)
{
dfs(i);
sum+=max(dp[i][0],dp[i][1]);
}
}
printf("%d\n",sum);
}
return 0;
}