```cpp
```cpp
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#define re register
using namespace std;
int n,m;
struct edge{int v;};
vector<edge>g[20000];
vector<edge>gg[20000];
bool b[10010][10010];
struct eddd{int u,v;};
eddd e[20000];
int st[250000];
int a[10050];
int top=0;
int cnt=0;
int d[12512];
int low[12200],dfn[12200];
int vis[12200],pre[12200],ru[12200];
int huan[12200];
int tot=0;
int rd(){
int out=0,f=1;
char c=getchar();
if(c==45)f=-1;
while(c<48||c>57)c=getchar();
while(c>=48&&c<=57){
out=(out<<1)+(out<<3)+c-48;
c=getchar();
}
return out*f;
}
void rt(int x){
if(x<0){
putchar(45);
x=-x;
}
if(x>9)rt(x/10);
putchar(x%10+48);
}
inline int minn(int a,int b){
int tm=(a-b)>>31;
return a&tm|b&~tm;
}
inline int maxx(int a,int b){
int tm=(a-b)>>31;
return a&~tm|b&tm;
}
void tarjan(int u){
vis[u]=1;
low[u]=dfn[u]=++cnt;
st[++top]=u;
for(int i=0;i<g[u].size();i++){
int v=g[u][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 y;
while (1){
y=st[top--];
pre[y]=u;
vis[y]=0;
if (u==y) break;
a[u]+=a[y];
}
}
}
int topsort(){
queue<int>q;
int tt=0;
for(int i=1;i<=n;i++)
if(pre[i]==i&&!ru[i]){
tt++;
q.push(i);
d[i]=a[i];
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<gg[u].size();i++){
int v=gg[u][i].v;
d[v]=max(d[v],d[u]+a[v]);
ru[v]--;
if(ru[v]==0)
q.push(v);
}
}
int ans=0;
for (int i=1;i<=n;i++)
ans=max(ans,d[i]);
/* for (int i=1;i<=n;i++)
if(pre[i]==i)
cout<<d[i]<<endl;*/
return ans;
}
int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(re int i=1;i<=m;i++){
scanf("%d%d",&e[i].u,&e[i].v);
g[e[i].u].push_back((edge){e[i].v});
}
for(re int i=1;i<=n;i++)
if(!dfn[i]){
tarjan(i);
// cout<<i<<endl;
}
for(re int i=1;i<=n;i++){
for(int j=0;j<g[i].size();j++){
int x=pre[i],y=pre[g[i][j].v];
if(x!=y&&!b[x][y]){
b[x][y]=1;
gg[x].push_back((edge){y});
ru[y]++;
}
}
}
/* for(int i=1;i<=n;i++){
cout<<i<<":";
for(int j=0;j<gg[i].size();j++){
cout<<gg[i][j].v<<" ";
}
cout<<"\n";
cout<<"点权:"<<a[i];
cout<<endl;
}*/
printf("%d",topsort());
return 0;
}
```
AC
```
by 3612999a @ 2018-10-26 10:50:01
%%%
by opened @ 2018-10-26 11:20:15