N开1e4、1e5都RE,开1e6过了
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=1e4+10,M=1e5+10;
int n,m,dfncnt,scccnt,cnt,ans;
//f[i]:经过i可获得的最大价值
int val[N],dfn[N],low[N],scc[N],w[N],rd[N],f[N];
bool vis[N],st[N];
vector<int> e[N],ne[N];
stack<int> s;
queue<int> q;
void dfs(int u){
low[u]=dfn[u]=++dfncnt;
s.push(u);
vis[u]=st[u]=1;
for(auto v:e[u]){
if(st[v]){
low[u]=min(low[u],dfn[v]);
}
else{
dfs(v);
low[u]=min(low[u],low[v]);
}
}
if(low[u]==dfn[u]){
++scccnt;
//cout<<u<<" "<<scccnt<<endl;
//cout<<s.top()<<endl;
while(!s.empty()){
int v=s.top();
scc[v]=scccnt;
s.pop();
st[v]=0;
if(v==u)break;
}
}
}
void toposort(){
for(int i=1;i<=scccnt;i++){
if(!rd[i])q.push(i);
f[i]=w[i];
ans=max(ans,f[i]);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(auto v:ne[u]){
f[v]=max(f[v],f[u]+w[v]);
ans=max(ans,f[v]);
rd[v]--;
if(!rd[v]){
q.push(v);
}
}
}
cout<<ans<<endl;
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=n;i++)cin>>val[i];
for(int i=1;i<=m;i++){
cin>>u>>v;
e[u].pb(v);
}
for(int i=1;i<=n;i++){
if(!vis[i])dfs(i);
}
//缩点
//for(int i=1;i<=n;i++)cout<<scc[i]<<" ";
//cout<<endl;
for(int i=1;i<=n;i++){
w[scc[i]]+=val[i];
for(auto v:e[i]){
if(scc[i]!=scc[v]){
ne[scc[i]].push_back(scc[v]);
rd[scc[v]]++;
}
}
}
toposort();
return 0;
}