求助,Thanks♪
#include<bits/stdc++.h>
using namespace std;
#define maxn 100010
#define maxm 500010
struct edge{
int to,nxt,from;
}e[maxm],e1[maxm];
queue<int>q;
int cnt,head[maxn],cnt2;
int low[maxn],dfn[maxn],p[maxn],sd[maxn];
int sta[maxn],top;
bool vis[maxn];
int in[maxn],dis[maxn],tot,h[maxn];
int n,m,t,answer;
void add(int id,int v){
e[++cnt].nxt=head[id];
head[id]=cnt;
e[cnt].from=id;
e[cnt].to=v;
}
void Tarjan(int id){
low[id]=dfn[id]=++t;
sta[++top]=id;
vis[id]=true;
for(register int i=head[id];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
Tarjan(v);low[id]=min(low[id],low[v]);
}
else if(vis[v]) low[id]=min(low[id],low[v]);
}
if(dfn[id]==low[id]){
int v2;
while(v2){
v2=sta[top--];
sd[v2]=id;vis[v2]=false;
if(id==v2)break;
p[id]+=p[v2];
}
}
}
int tuopu(){
for(register int i=1;i<=n;i++){
if(sd[i]==i&&!in[i]){
q.push(i);dis[i]=p[i];
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(register int i=h[u];i;i=e1[i].nxt){
int v=e1[i].to;
dis[v]=max(dis[u]+p[v],dis[v]);
in[v]--;
if(in[v]==0)
q.push(v);
}
}
for(register int i=1;i<=n;i++){
answer=max(answer,dis[i]);
}
return answer;
}
int main(){
cin>>n>>m;
for(register int i=1;i<=n;i++)cin>>p[i];
for(register int i=1,u,v;i<=m;i++)cin>>u>>v,add(u,v);
for(register int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
for(register int i=1;i<=m;i++){
int now=sd[e[i].from];
int yy=sd[e[i].to];
if(now!=yy){
e1[++cnt2].nxt=h[now];e1[cnt2].to=yy;
e1[cnt2].from=now;h[now]=cnt2;
in[yy]++;
}
}
cout<<tuopu()<<endl;
return 0;
}