#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#define int long long
using namespace std;
typedef long long ll;
inline ll read(){
ll f=1,sum=0;char c=getchar();
while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) {sum=sum*10+c-'0';c=getchar();}
return sum*f;
}//快读
inline void print(ll x){
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}//快写
const int N=1e4+10;
vector<vector<int> > scc;
int dfn[N],low[N],id[N],cnt[N],ans[N],f[N],a[N],scca[N],timestamp,scccnt,n,m;
bool vis[N];
stack<int> st;
vector<int> vc[N],va[N];
vector<pair<int,int> > vv;
queue<int> q;
void tarjan(int u){
dfn[u]=low[u]=timestamp++;
vis[u]=1;
st.push(u);
for(int v:vc[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
scccnt++;
while(1){
int v=st.top();
st.pop();
vis[v]=0;
id[v]=scccnt;
scca[scccnt]+=a[v];
if(v==u) break;
}
}
}
void topu(){
for(int i=1;i<=scccnt;i++){
if(cnt[i]==0) q.push(i);
ans[i]=scca[i];
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int v:va[u]){
ans[v]=max(ans[v],ans[u]+scca[v]);
if(--cnt[v]==0) q.push(v);
}
}
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
if(u==v) continue;
vc[u].push_back(v);
vv.push_back({u,v});
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(auto x:vv){
int u=x.first,v=x.second;
if(id[u]!=id[v]){
va[id[u]].push_back(id[v]);
cnt[id[v]]++;
}
}
topu();
int sum=0;
for(int i=1;i<=scccnt;i++) sum=max(sum,ans[i]);
cout<<sum;
return 0;
}
此题代码这样写能过,但是是错误的,注意代码第34行是timestamp++,而timestamp初值为0,应改为++timestamp