简单树形dp,建立一个总源点就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define Max(a,b) a>b?a:b
using namespace std;
const int INF=1005;
int dp[INF],visit[INF],v[INF];
vector<int> vec[INF];
void dfs(int cur)
{
if(visit[cur]) return;
int size=vec[cur].size();
if(size==0)
{
dp[cur]=v[cur];
return;
}
for(int i=0;i<size;i++)
{
int child=vec[cur][i];
dfs(child);
visit[child]=1;
dp[cur]=Max(dp[cur],dp[child]+v[cur]);
}
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
scanf("%d",&m);
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
vec[a].push_back(b);
}
for(int i=1;i<=n;i++)
{
vec[0].push_back(i);
}
memset(dp,0,sizeof(dp));
memset(visit,0,sizeof(visit));
dfs(0);
printf("%d\n",dp[0]);
for(int i=0;i<=n;i++)
vec[i].clear();
}
return 0;
}