同问
```pascal
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int n,m;const int maxn=10005;
vector<int> ve[maxn];
vector<int> sd[maxn];
int dq[maxn];
int dq2[maxn];int dp[maxn];
int dfn[maxn],low[maxn],cnt=0;
int colo[maxn];
int sta[maxn];int din=0;
int inq[maxn];
void dfs(int x,int fa){
int sz=ve[x].size();
dfn[x]=low[x]=++cnt;
inq[x]=1;
sta[++din]=x;
rep(i,0,sz-1){
int y=ve[x][i];
if(dfn[y]&&inq[y]){
low[x]=min(low[x],dfn[y]);
}else{
dfs(y,x);
low[x]=min(low[x],low[y]);
}
}
if(low[x]==dfn[x]){
while(din&&sta[din]!=x){
if(!din)break;
dq2[x]+=dq[sta[din]];
inq[sta[din]]=0;
colo[sta[din--]]=x;
}
if(din){
dq2[x]+=dq[x];
colo[sta[din--]]=x;
}
}else dq2[x]=dq[x];
}
int dfs2(int x){
if(dp[x]!=0x3f3f3f3f)return dp[x];
dp[x]=dq2[x];
int sz=sd[x].size();
rep(i,0,sz-1)dp[x]=max(dp[x],dfs2(sd[x][i])+dq2[x]);
return dp[x];
}
int main(){
scanf("%d%d",&n,&m);
rep(i,1,n)scanf("%d",dq+i);
rep(i,1,m){
int u,v;scanf("%d%d",&u,&v);
ve[u].push_back(v);
}
rep(i,1,n)if(!dfn[i])dfs(i,-1);
#ifdef LOCAL
rep(i,1,n)cout<<dfn[i]<<" ";;cout<<endl;
rep(i,1,n)cout<<low[i]<<" ";;cout<<endl;
rep(i,1,n)cout<<colo[i]<<" ";;cout<<endl;
rep(i,1,n)cout<<dq2[i]<<" ";;cout<<endl;
#endif
rep(i,1,n){
int sz=ve[i].size();
rep(j,0,sz-1)
if(colo[ve[i][j]]!=colo[i])
sd[colo[i]].push_back(colo[ve[i][j]]);
}
#ifdef LOCAL
rep(i,1,n)if(colo[i]){
int sz=sd[i].size();
rep(j,0,sz-1)cout<<sd[i][j]<<" "<<" ";
cout<<endl;
}
#endif
int ans=0;
memset(dp,0x3f,sizeof dp);
rep(i,1,n)if(colo[i]==i)ans=max(ans,dfs2(i));
cout<<ans<<endl;
return 0;
}
```
by ferrum_cccp @ 2018-11-21 23:26:18