#include<bits/stdc++.h>
#define N 100005
#define inf 0x3f3f3f3f
#define max(a,b) (((a)>(b))?(a):(b))
#define min(a,b) (((a)>(b))?(b):(a))
using namespace std;
int n,m,ans=-inf;
int a[N];
int cnt=1,head[N],head2[N];
int ru[N],dp[N];
struct node{int to,nxt;}e[N<<1],e2[N<<1];
int dfn[N],low[N],tot,sum;
stack<int>s;
bool vis[N];
int col[N],val[N];
inline void add(register int u,register int v){
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
inline void add2(register int u,register int v){
e2[++cnt].to=v;
e2[cnt].nxt=head2[u];
head2[u]=cnt;
}
inline int read(){
register int f=1,k=0;
register char c=getchar();
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
if(c=='-') f=-1,c=getchar();
while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+(c^48),c=getchar();
return f*k;
}
inline void write(register int x){
if(x<0) x=-x, putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void tarjan(int u){
s.push(u);
vis[u]=1;
dfn[u]=low[u]=++tot;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
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]){
++sum;
int i=s.top();s.pop();
col[i]=sum;
vis[i]=0;
val[sum]+=a[i];
while(i!=u){
i=s.top();s.pop();
col[i]=sum;
vis[i]=0;
val[sum]+=a[i];
}
}
}
inline int dfs(int u,int fa){
for(int i=head2[u];i;i=e2[i].nxt){
int v=e2[i].to;
if(v^fa){
dfs(v,u);
dp[u]=max(dp[u],dp[v]+val[v]);
}
}
}
main(void){
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int u,v,i=1;i<=m;i++){
u=read();v=read();
add(u,v);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
cnt=1;
// for(int i=1;i<=n;i++) cout<<col[i]<<'\n';
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=e[j].nxt){
int v=e[j].to;
if(col[i]^col[v]) add2(col[i],col[v]),++ru[col[v]];
}
for(int i=1;i<=sum;i++)
if(!ru[i]) add2(0,i);
dfs(0,-1);
write(dp[0]),putchar('\n');
return 0;
}
本地调试下的内存竟然达到了1024mb???请问一下这是为什么??