代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,a[N/10],hd[N/10],nxt[N],tot,dfn[N],low[N],tme,vis[N],scc_cnt,scc_id[N],scc_sum[N],ans,vis2[N];
stack<int>stk;
vector<int>e2[N];
struct nd{
int u,v;
}e[N];
void add(int u,int v){
e[tot].v=v;
e[tot].u=u;
nxt[tot]=hd[u];
hd[u]=tot++;
}
void tarjan(int u){
low[u]=dfn[u]=++tme;
vis2[u]=1;
stk.push(u);vis[u]=1;
for(int i=hd[u];~i;i=nxt[i]){
int v=e[i].v;
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]){
int v;scc_cnt++;
do{
v=stk.top();stk.pop();
vis[v]=0;
scc_id[v]=scc_cnt;
scc_sum[scc_cnt]+=a[v];
}while(u!=v);
}
}
void dfs(int u,int step,int fa){
step+=scc_sum[u];
if(e2[u].size()==0){
ans=max(ans,step);
return;
}
for(auto v:e2[u]){
if(v==fa) continue;
dfs(v,step,u);
}
}
int main(){
cin>>n>>m;
memset(hd,-1,sizeof hd);
for(int i=1;i<=n;i++) cin>>a[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(!vis2[i])tarjan(i);
}
for(int i=1;i<=m;i++){
if(scc_id[e[i].u]!=scc_id[e[i].v]){
e2[scc_id[e[i].u]].push_back(scc_id[e[i].v]);
}
}
for(int i=1;i<=scc_cnt;i++){
dfs(i,0,0);
}
cout<<ans;
return 0;
}