#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5,maxm=1e5+7;
int n,m;
vector<int> e[maxn];
int dfn[maxn],low[maxn],head[maxm],co[maxn],stk[maxn],grp[maxn],val[maxn];
int top,col,num,cnt;
void add(int u,int v){
e[u].push_back(v);
}
void tarjan(int u){
dfn[u]=low[u]=++num;
stk[++top]=u;
for(int i=0;i<e[i].size();i++){
int v=e[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!co[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
co[u]=++col;
grp[col]+=val[u];
while(stk[top]==u){
grp[col]+=val[stk[top]];
co[stk[top--]]=col;
}
top--;
}
}
vector<int> nw[maxn];
queue<int> q;
int ind[maxn],oud[maxn],tp[maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>val[i];
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int u=1;u<=n;u++){
for(int i=0;i<e[i].size();i++){
int v=e[u][i];
if(co[u]!=co[v]){
nw[co[u]].push_back(co[v]);
ind[v]++,oud[u]++;
}
}
}
for(int i=1;i<=col;i++){
if(!ind[i]){
q.push(i);
tp[i]=grp[i];
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(auto v:nw[u]){
// int v=nw[u][i];
ind[v]--;
tp[v]=max(tp[v],tp[u]+grp[v]);
if(!ind[v])q.push(v);
}
}
int ans=0;
for(int i=1;i<=col;i++){
if(!oud[i])ans=max(ans,tp[i]);
}
cout<<ans<<'\n';
return 0;
}
0pts,样例过了,不知道是哪里有问题
用了tarjan和topo