写得有点乱,看不出tarjan哪里错了,40pts。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
inline int read(){
int x=0,f=1;
char ac=getchar();
while(ac<'0'||ac>'9'){
if(ac=='-') f=-1;
ac=getchar();
}
while(ac>='0'&&ac<='9'){
x=(x<<3)+(x<<1)+(ac-'0');
ac=getchar();
}
return x*f;
}
int n,m,cnt,tot,num,now,t[100005],nxt[100005],h[10005],dfn[10005],low[10005],co[10005],r[10005],s[10005],from[100005],sum[10005],a[10005],dp[10005],ans,x[100005],y[100005];
bool vis[10005];
void add(int u,int v){
t[++cnt]=v;
from[cnt]=u;
nxt[cnt]=h[u];
h[u]=cnt;
}
void tarjan(int u){
dfn[u]=++now;
low[u]=dfn[u];
s[++tot]=u;
vis[u]=true;
for(int i=h[u];i;i=nxt[i]){
if(!dfn[t[i]]){
tarjan(t[i]);
low[u]=min(low[u],low[t[i]]);
}
else if(vis[t[i]]) low[u]=min(low[u],dfn[t[i]]);
}
if(low[u]==dfn[u]){
num++;
while(s[tot]!=u){
sum[num]+=a[s[tot]];
co[s[tot]]=num;
vis[s[tot]]=false;
tot--;
}
sum[num]+=a[s[tot]];
co[s[tot]]=num;
vis[s[tot]]=false;
tot--;
}
}
void tuo(){
queue<int> q;
for(int i=1;i<=num;i++){
if(!r[i]){
q.push(i);
dp[i]=sum[i];
}
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=h[u];i;i=nxt[i]){
int v=t[i];
dp[v]=max(dp[v],dp[u]+sum[v]);
r[v]--;
if(!r[v]) q.push(v);
}
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++){
x[i]=read(),y[i]=read();
add(x[i],y[i]);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
memset(t,0,sizeof(t));
memset(from,0,sizeof(from));
memset(nxt,0,sizeof(nxt));
memset(h,0,sizeof(h));
cnt=0;
for(int i=1;i<=m;i++){
if(co[x[i]]!=co[y[i]]){
r[co[x[i]]]++;
add(co[x[i]],co[y[i]]);
}
}
tuo();
for(int i=1;i<=num;i++){
ans=max(ans,dp[i]);
}
printf("%d",ans);
return 0;
}