https://www.luogu.com.cn/record/68021406 #1,3,4,5,7,9WA了
#include<cstdio>
class IO{
char qu[55],c;
int qr;
bool f;
public:
template<typename T>
IO&operator>>(T&x){
for(f=1,c=getchar();c<48||c>57;c=getchar())
f^=c=='-';
for(x=0;c<=57&&c>=48;c=getchar())
x=(x<<1)+(x<<3)+(c&15);
x=f?x:-x;
return*this;
}
template<typename T>
IO&operator<<(T x){
if(!x) putchar(48);
else{
if(x<0) putchar('-'),x=-x;
while(x) qu[++qr]=x%10^48,x/=10;
while(qr) putchar(qu[qr--]);
}
return*this;
}
IO&operator<<(const char&ch){
putchar(ch);
return*this;
}
IO&operator<<(const char*s){
for(int i=0;s[i];++i)
putchar(s[i]);
return*this;
}
}cio;
#include<vector>
#include<queue>
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x<y?y:x)
#define MX 10001
int n,m;
class Graph{
//graph
std::vector<int>g[MX];
int w[MX];
//tarjan
int s[MX],top=0,vis[MX];
int low[MX],dfn[MX],ti;
//new graph
std::vector<int>gg[MX];
int ww[MX],col[MX],cn;
//topo_sort
std::queue<int>q;
int inm[MX],ans[MX];
public:
void Add(int u,int v){
g[u].push_back(v);
}
void W(int u,int w_){
w[u]=w_;
}
void Tarjan(int u){
vis[u]=true;
dfn[u]=low[u]=++ti;
s[++top]=u;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dfn[v]){
Tarjan(v);
low[u]=Min(low[u],low[v]);
}
else
low[u]=Min(low[u],low[v]);
}
if(dfn[u]==low[u]){
int v;
cn++;
while(v=s[top--]){
col[v]=cn;
vis[v]=false;
ww[u]+=w[v];
if(u==v)
break;
}
}
}
int Topo_sort(){
for(int i=1;i<=cn;i++)
if(!inm[i])
q.push(i);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<gg[u].size();i++){
int v=gg[u][i];
ww[v]=Max(ww[v],ww[u]+w[v]);
inm[v]--;
if(!inm[v])
q.push(v);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=Max(ans,ww[i]);
return ans;
}
void Suo_Dian(){
for(int i=1;i<=n;i++)
if(!dfn[i])
Tarjan(i);
for(int u=1;u<=n;u++)
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(u!=v){
gg[u].push_back(v);
inm[col[v]]++;
}
}
}
}g;
int main(){
int u,v,temp;
cio>>n>>m;
for(int i=1;i<=n;i++){
cio>>temp;
g.W(i,temp);
}
for(int i=1;i<=m;i++){
cio>>u>>v;
g.Add(u,v);
}
g.Suo_Dian();
cio<<g.Topo_sort();
return 0;
}