同一份代码多次提交输出结果不一样?
查看原帖
同一份代码多次提交输出结果不一样?
261932
qpdk777楼主2020/9/8 17:50

有时候能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;
}
2020/9/8 17:50
加载中...