Kosaraju 算法
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int n,m,a[MAXN],na[MAXN];
bool vis[MAXN];
vector<int>v[MAXN],v2[MAXN];
vector<int>s;
vector<int>nv[MAXN];
void dfs1(int x){
vis[x]=1;
for(auto i:v[x]){
if(!vis[i]) {
vis[i]=1;
dfs1(i);
}
}
s.push_back(x);
}
int sccs=0,color[MAXN];
void dfs2(int x){
color[x]=sccs;
for(auto i:v2[x]){
if(!color[i]){
color[i]=sccs;
dfs2(i);
}
}
}
int lg[MAXN];
int dfs3(int x,int last){
if(lg[x]) return lg[x];
int e=0;
for(auto i:nv[x]){
if(i!=x) e=max(e,dfs3(i,x));
}
lg[x]=e+na[x];
return lg[x];
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
v2[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs1(i);
}
}
sccs=0;
for(int i=n;i>0;i--){
if(!color[i]){
sccs++;
dfs2(i);
}
}
for(int i=1;i<=n;i++){
na[color[i]]+=a[i];
for(int k:v[i]){
bool flag=1;
for(int j=0;j<nv[color[i]].size();j++){
if(nv[color[i]][j]==k){
flag=0;
break;
}
}
if(flag) nv[color[i]].push_back(k);
}
}
memset(vis,0,sizeof(vis));
int ans=0;
for(int i=1;i<=sccs;i++){
if(!lg[i])ans=max(ans,dfs3(i,0));
}
cout<<ans;
return 0;
}