用的记忆化搜索,dp[i]记录i节点到终点的最长距离。这题数据很大,用cin,cout就T了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 100000+10
#define maxe 1000000+10
#define ll long long
#define inf 0x3f3f3f3f
struct edge
{
int to,nxt;
}e[maxe];
int head[maxn],in[maxn],out[maxn],vis[maxn],n,m;
ll w[maxn];
ll dp[maxn];
ll dfs(int u)
{
if(!out[u]) { vis[u]=1;dp[u]=w[u];return dp[u];}
if(vis[u]) return dp[u];
ll ans=-inf;
for(int i=head[u];i!=-1;i=e[i].nxt)
{
int v=e[i].to;
ans=max(ans,dfs(v)+w[u]);
}
dp[u]=ans;
vis[u]=1;
return dp[u];
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
for(int i=1;i<=n;i++)
{
head[i]=-1;
dp[i]=0;
out[i]=in[i]=0;
vis[i]=0;
}
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
out[u]++;
in[v]++;
e[i].to=v;
e[i].nxt=head[u];
head[u]=i;
}
ll ans=-inf;
for(int i=1;i<=n;i++)
if(!in[i])
ans=max(ans,dfs(i));
printf("%lld
",ans);
}
return 0;
}