捞+疑惑+悬关
查看原帖
捞+疑惑+悬关
509310
LiAuPb楼主2024/1/21 19:45

捞:https://www.luogu.com.cn/discuss/758772

疑惑:

这是现在的code:

#include<bits/stdc++.h>
#define N 4000010
using namespace std;
int n, m, u, v, tot, dcccnt, cnt, top;
int h[N], dfn[N], low[N], col[N], st[N];
bool a, b;
struct node{
	int ne, to;
}G[N];
void add(int u, int v){
	G[++tot] = {h[u], v};
	h[u] = tot;
}
void tarjan(int u){
	dfn[u] = low[u] = ++dcccnt;
	st[top++] = u;
	for(int i = h[u]; i; i = G[i].ne){
		int v = G[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(!col[v]) low[u] = min(low[u], dfn[v]);
	}
	if(dfn[u] == low[u]){
		cnt++;
		while(true){
			int t = st[--top];
			col[t] = cnt;
			if(t == u) break;
		}
	}
}
int main(){
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; i++){
		scanf("%d %d %d %d", &u, &a, &v, &b);
		add(u + (a ^ 1) * n, v + b * n);
		add(v + (b ^ 1) * n, u + a * n);
	}
	for(int i = 1; i <= n * 2; i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i = 1; i <= n; i++){
		if(col[i] == col[i + n]){
			printf("IMPOSSIBLE");
			return 0;
		}
	}
	puts("POSSIBLE");
	for(int i = 1; i <= n; i++) printf("%d ", col[i] > col[i + n]);
	return 0;
}

Luogu样例#1:

输入:

10 10
3 0 2 0
10 1 9 0
2 1 4 0
10 1 2 1
2 1 2 0
10 1 9 1
2 1 4 0
10 0 9 1
1 1 8 1
8 0 2 1

我的输出:

POSSIBLE
0 1 0 0 0 0 0 1 1 1

Luogu显示WA,原因:

Wrong Answer.wrong answer Wrong in No.4 clause , input is {10,1,2,1} , your xval is 0 , yval is 0

即:x10x_{10} 和 x2x_{2} 应该有一个为1,但输出中 x10x_{10} 和 x2x_{2} 都为0。

但是我的本地样例输出中 x10x_{10} 和 x2x_{2} 都为1?

求解释+悬关。

2024/1/21 19:45
加载中...