将遇到回边时更新改为low[x]=min(low[x],low[y]);依然通过测试(100pts)
#include<bits/stdc++.h>
#define N 200010
#define M 200010
using namespace std;
int n,m,cntc,ans,cnte;
int a[N];
int tot,head[N],to[M],nxt[M];
int depth,top,z[N],v[N],in[N],dfn[N],low[N];
int f[N],sum[N],belong[N],indegree[N];
vector<int>scc[N];
struct rec{
int x,y;
}edge[M];
void add(int x,int y){to[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
void tarjan(int x){
z[++top]=x,v[x]=1,in[x]=1;
dfn[x]=low[x]=++depth;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(!v[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(in[y])low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
cntc++;
do{
scc[cntc].push_back(z[top--]);
in[scc[cntc].back()]=0;
sum[cntc]+=a[scc[cntc].back()];
belong[scc[cntc].back()]=cntc;
}while(scc[cntc].back()!=x);
}
}
void topsort(){
queue<int>q;
for(int i=1;i<=cntc;i++)if(!indegree[i])q.push(i);
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
f[y]=max(f[y],f[x]+sum[y]);
if(!--indegree[y])q.push(y);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++)if(!v[i])tarjan(i);
for(int i=1;i<=cntc;i++){
vector<int>::iterator x;
for(x=scc[i].begin();x<scc[i].end();x++){
for(int j=head[*x];j;j=nxt[j]){
int y=to[j],flag=0;
vector<int>::iterator z;
for(z=scc[i].begin();z<scc[i].end();z++){
if(*z==*x)continue;
if(*z==y){
flag=1;
break;
}
}
if(flag)continue;
edge[++cnte].x=*x,edge[cnte].y=y;
indegree[belong[y]]++;
}
}
}
memset(to,0,sizeof(to));memset(nxt,0,sizeof(nxt));memset(head,0,sizeof(head));
tot=0;
for(int i=1;i<=cnte;i++)add(belong[edge[i].x],belong[edge[i].y]);
for(int i=1;i<=cntc;i++)f[i]=sum[i];
topsort();
for(int i=1;i<=cntc;i++)ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}