wa1 7 3 4 5; 不理解
#include<bits/stdc++.h>
using namespace std;
int n,m,sum,top,s,tim;
int p[300005],head[300005],sd[300005],dfn[300005],low[300005];
int stac[300005],vis[300005];
int h[300005],in[300005],dist[300005];
struct edge{
int to,from,next;
}e[300005],ed[300005];
void add(int x,int y){
e[++sum].next=head[x];
e[sum].from=x;
e[sum].to=y;
head[x]=sum;
}
void tarjan(int x)
{
low[x]=dfn[x]=++tim;
stac[++top]=x;vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]){
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if(vis[v]){
low[x]=min(low[x],low[v]);
}
}
if(dfn[x]==low[x]){
int y;
while(y=stac[top--]){
sd[y]=x;
vis[y]=0;
if(x==y){
break;
}
p[x]+=p[y];
}
}
}
int topo(){
queue< int > q;
int top=0;
for(int i=1;i<=n;i++){
if(sd[i]==i&&!in[i]){
q.push(i);
dist[i]=p[i];
}
}
while(!q.empty()){
int k=q.front();
q.pop();
for(int i=h[k];i;i=ed[i].next){
int v=ed[i].to;
dist[v]=max(dist[v],dist[k]+p[v]);
in[v]--;
if(in[v]==0){
q.push(v);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dist[i]);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
}
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=m;i++){
int x=sd[e[i].from],y=sd[e[i].to];
if(x!=y){
ed[++s].next=head[x];
ed[s].to=y;
ed[s].from=x;
h[x]=s;
in[y]++;
}
}
printf("%d",topo());
return 0;
}