RT.
找不出任何错误。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5,maxm=1e5+5;
int n,m;
int a[maxn];
int head[2][maxn];
struct EDGE
{
int to,nxt;
}edge[2][maxm<<1];
int cnt[2];
void add(int u,int to,int id)
{
edge[id][++cnt[id]].to=to;
edge[id][cnt[id]].nxt=head[id][u];
head[id][u]=cnt[id];
}
int dfn[maxn],low[maxn];
int dfncnt;
int scccnt;
int color[maxn];
int sta[maxn],top;
bool ins[maxn];
int sccval[maxn];
void tarjan(int u)
{
dfn[u]=low[u]=++dfncnt;
sta[++top]=u;
ins[u]=1;
for(int i=head[0][u];i;i=edge[0][i].nxt)
{
int to=edge[0][i].to;
if(!dfn[to])
{
tarjan(to);
low[u]=min(low[u],low[to]);
}
else if(ins[to])
{
low[u]=min(low[u],dfn[to]);
}
}
if(dfn[u]==low[u])
{
scccnt++;
while(sta[top]!=u)
{
color[sta[top]]=scccnt;
sccval[scccnt]+=a[sta[top]];
ins[sta[top]]=0;
top--;
}
color[u]=scccnt;
sccval[scccnt]+=a[u];
ins[u]=0;
top--;
}
}
int que[maxn],qhead,qtail;
int indu[maxn];
int dp[maxn];
void topo()
{
qhead=1,qtail=0;
for(int i=1;i<=scccnt;i++)
{
if(indu[i]==0)
{
que[++qtail]=i;
dp[i]=sccval[i];
}
}
while(qhead<=qtail)
{
int u=que[qhead++];
for(int i=head[1][u];i;i=edge[1][i].nxt)
{
int to=edge[1][i].to;
indu[to]--;
dp[to]=max(dp[to],dp[u]+sccval[to]);
if(indu[to]==0)
{
que[++qtail]=to;
}
}
}
int ans=0;
for(int i=1;i<=scccnt;i++)
{
ans=max(ans,dp[i]);
}
printf("%d",ans);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v,0);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int i=1;i<=n;i++)
{
for(int j=head[0][u];j;j=edge[0][j].nxt)
{
int to=edge[0][j].to;
if(color[i]!=color[to])
{
add(color[i],color[to],1);
indu[color[to]]++;
}
}
}
topo();
return 0;
}