代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
const int inf=1e9+7;
int n,m,ans,a[maxn],ind[maxn],dist[maxn];
stack<int> st;
vector<int> g[maxn],g2[maxn];
int u[maxn],v[maxn],dfn[maxn],low[maxn],color[maxn],vis[maxn],dfs_num,c;
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void tarjan(int x) {
dfn[x]=low[x]=++dfs_num;
vis[x]=true;
st.push(x);
for(int i=0; i<g[x].size(); ++i) {
int v=g[x][i];
if(!dfn[v]) {
tarjan(v);
low[x]=min(low[x],low[v]);
} else if(vis[v]) low[x]=min(low[x],dfn[v]);
}
if(dfn[x]==low[x]) {
c++;
while(1) {
int s=st.top();
st.pop();
vis[s]=false;
color[s]=c;
// printf("%d ",s);
if(x==s) break;
a[c]+=a[s];
}
// puts("");
}
}
inline int topsort() {
queue<int> q;
for(int i=1; i<=n; ++i)
if(!ind[i]&&color[i]==i) q.push(i),dist[i]=a[i];
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=0; i<g2[u].size(); ++i) {
int v=g2[u][i];
dist[v]=max(dist[u]+a[v],dist[v]);
if(--ind[v]==0) q.push(v);
}
}
for(int i=1; i<=n; ++i)
ans=max(ans,dist[i]);
return ans;
}
signed main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read(),m=read();
for(int i=1; i<=n; ++i) a[i]=read();
for(int i=1; i<=m; ++i) {
u[i]=read(),v[i]=read();
g[u[i]].push_back(v[i]);
}
for(int i=1; i<=n; ++i)
if(!dfn[i]) tarjan(i);
for(int i=1; i<=n; ++i) {
int x=color[u[i]],y=color[v[i]];
if(x!=y) {
g2[x].push_back(y);
ind[y]++;
}
}
printf("%d\n",topsort());
return 0;
}