写得又臭又长,不好意思
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 1e4;
const int M = 1e5 + 1e4;
int head[N],pre[N],id[N],dfn[N];
int low[N],w[N],s[N],rd[N],k,tp,tot;
int f[N],ans;
struct node{
int u,to,next;
}e[M];
struct node2{
int u,v,next;
}edges[M];
int n,m,sc,dfncnt;
bool insta[N];
queue <int> q;
void add(int u,int v){
k++;
e[k].u = u;
e[k].next = head[u];
e[k].to = v;
head[u] = k;
}
void addd(int u,int v){
tot++;
edges[tot].u = u;
edges[tot].v = v;
edges[tot].next = pre[u];
pre[u] = tot;
}
void tarjan(int u){
insta[u] = 1;
s[++tp] = u;
low[u] = dfn[u] = ++dfncnt;
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u],low[v]);
}else if(insta[v]) low[u] = min(low[u],dfn[v]);
}
if(dfn[u] == low[u]){
sc++;
while(s[tp] != u){
id[s[tp]] = sc;
insta[s[tp]] = 0;
w[u] += w[s[tp]];
--tp;
}
id[s[tp]] = sc;
insta[s[tp]] = 0;
--tp;
}
}
void dp(){
queue <int> q;
for(int i = 1;i <= n;i++){
if(!rd[i]){
q.push(i);
f[i] = w[i];
}
}
while(!q.empty()){
int u = q.front();
for(int i = pre[u];i;i = edges[i].next){
int v = edges[i].v;
rd[v]--;
if(!rd[v]) q.push(v);
f[v] = max(f[u] + w[v],f[v]);
}
q.pop();
}
for(int i = 1;i <= n;i++) ans = max(ans,f[i]);
printf("%d",ans);
}
int main(){
scanf("%d%d",&n,&m);
int u,v;
for(int i = 1;i <= n;i++) scanf("%d",&w[i]);
for(int i = 1;i <= m;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i = 1;i <= n;i++)
if(!dfn[i]) tarjan(i); //tarjan
for(int i = 1;i <= m;i++){
int x = e[i].u;
int y = e[i].to;
if(id[x] != id[y]){
addd(x,y);
rd[y]++;
}
}
dp();
return 0;
}