80分,不知道哪里错了qaq
#include<bits/stdc++.h>
using namespace std;
const int size=1000010;
int n,m,tot=1,num,cnt,top;
int ver[size],nxt[size],head[size];
int stk[size],dfn[size],low[size],ins[size],ind[size],inq[size];
int hc[size],vc[size],nc[size],tc=1;
int d[size],w[size],c[size],p[size];
int ans=0;
inline void add(int x,int y){
ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
inline void cadd(int x,int y){
vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;
}
void tarjan(int x){
dfn[x]=low[x]=++num;
stk[++top]=x,ins[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y]) low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
cnt++;int y;
do{
y=stk[top--];
c[y]=cnt;
ins[y]=0;
w[cnt]+=p[y];
}while(x!=y);
}
}
queue<int> q;
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>p[i];
for(int i=1;i<=m;++i){
int x,y;
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);
for(int x=1;x<=n;++x)
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(c[x]==c[y]) continue;
cadd(c[x],c[y]);
ind[y]++;
}
for(int i=1;i<=cnt;++i) d[i]=-0x3f3f3f3f;
for(int i=1;i<=cnt;++i) d[i]=w[i];
for(int i=1;i<=cnt;++i) if(!ind[i]) q.push(i),inq[i]=1,d[i]=w[i];
while(!q.empty()){
int x=q.front();q.pop();
inq[x]=0;
for(int i=hc[x];i;i=nc[i]){
int y=vc[i];
if(d[y]<d[x]+w[y]){
d[y]=d[x]+w[y];
if(!inq[y]) inq[y]=1,q.push(y);
}
}
}
for(int i=1;i<=cnt;++i) ans=max(ans,d[i]);
cout<<ans<<endl;
return 0;
}