有时候能AC,有时候会WA第4个点。
每次WA,read的值不一样。
是我代码有错误吗?
是开了随机测评数据吗?
求助dalao orz
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define re register
#define MAXN 100100
using namespace std;
int n,m,x[MAXN],y[MAXN],tot,num,cnt;
int head[MAXN],ver[MAXN],nxt[MAXN];
int a[MAXN],dfn[MAXN],low[MAXN];
int top,stack[MAXN],ins[MAXN],c[MAXN];
int ans[MAXN],p[MAXN],all;
vector<int> scc[MAXN];
int read(){
int x=0,f=0;
char ch = getchar();
while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0'&&ch<='9'){
x = (x<<3) + (x<<1) + (ch-'0');
ch = getchar();
}
return f ? ~x+1 : x;
}
void add(int x,int y){
ver[++tot] = y, nxt[tot] = head[x], head[x] = tot;
}
void tarjin(int x){
dfn[x] = low[x] = ++num;
stack[++top] = x, ins[x] = 1;
for(re int i = head[x]; i ; i = nxt[i]){
int y = ver[i];
if(!dfn[y]){
tarjin(y);
low[x] = min(low[x],low[y]);
}
else if(ins[y])
low[x] = min(low[x],dfn[y]);
}
if(dfn[x] == low[x]){
++cnt;int y;
do{
y = stack[top--], ins[y] = 0;
c[y] = cnt, scc[cnt].push_back(y);
}while(x != y);
}
}
int dp(int x){
if(ans[x]) return ans[x];
for(re int i = head[x]; i ; i = nxt[i])
ans[x] = max(ans[x],dp(ver[i]));
ans[x] += p[x];
}
int main(){
n=read(), m=read();
for(re int i = 1; i <= n; ++i) a[i] = read();
for(re int i = 1; i <= m; ++i)
x[i] = read(), y[i] = read(), add(x[i],y[i]);
for(re int i = 1; i <= n; ++i) if(!dfn[i]) tarjin(i);
tot = 0;
memset(head,0,sizeof(head));
memset(ver,0,sizeof(ver));
memset(nxt,0,sizeof(nxt));
for(re int i = 1; i <= n; ++i)
p[c[i]] += a[i];
for(re int i = 1; i <= m; ++i)
if(c[x[i]] != c[y[i]]) add(c[x[i]],c[y[i]]);
for(re int i = 1; i <= cnt; ++i)
if(!ans[i]) dp(i);
for(re int i = 1; i <= cnt; ++i)
all = max(all,ans[i]);
cout<<all<<endl;
return 0;
}