WA on #4,#5,#7(存图用的vector)
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
long long x,y;
};
vector<long long> v[100005],vt[100005];
long long n,m;
long long dfn[100005],a[1000005],low[100005],co[1000005],ti,cnt,p[100005],r[100005],kkk=1;
stack <int> st;
void Tarjan(int u){
st.push(u);
dfn[u]=++ti;
low[u]=dfn[u];
for(int i=0;i<v[u].size();i++){
int to=v[u][i];
if(!dfn[to]){
Tarjan(to);
low[u]=min(low[u],low[to]);
}else{
if(!co[to]){
low[u]=min(low[u],dfn[to]);
}
}
}
if(low[u]==dfn[u]){
++cnt;
co[u]=cnt;
p[cnt]=a[u];
while(st.top()!=u){
int t=st.top();
st.pop();
co[t]=cnt;
p[cnt]+=a[t];
}
st.pop();
}
}
int vis[10005],dis[10005];
void spfa(){
memset(dis,-0x3f,sizeof(dis));
queue <int> q;
q.push(kkk);
vis[kkk]=1;
dis[kkk]=p[kkk];
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
// cout<<".";
for(int i=0;i<vt[now].size();i++){
int son=vt[now][i];
if(dis[son]<dis[now]+p[son]){
dis[son]=dis[now]+p[son];
if(!vis[son]){
vis[son]=1;
//cout<<".";
q.push(son);
}
}
}
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y;
v[x].push_back(y);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) Tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j=0;j<v[i].size();j++){
if(co[i]!=co[v[i][j]]){
vt[co[i]].push_back(co[v[i][j]]);
r[co[v[i][j]]]++;
}
}
// cout<<endl;
}
for(int i=1;i<=cnt;i++){
// cout<<r[i]<<endl;
if(!r[i]){
kkk=i;
break;
}
}
// cout<<kkk<<endl;
spfa();
int ma=-1000000;
for(int i=1;i<=cnt;i++){
ma=max(ma,dis[i]);
}
cout<<ma;
return 0;
}