为什么样例输出错误也ac?
查看原帖
为什么样例输出错误也ac?
1183187
sxhy楼主2024/4/26 16:53

代码对于样例输出:0 0 1,按照题意不应该是错的吗?

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6*2+7,M=N;
int n,m,dfn[N],low[N],new_g[N],cnt,idx=1,h[N],vis[N],tot;
int stk[N], top;
struct node {
	int v, ne;
}e[M];

void add(int a,int b) {
	e[++idx] = {b,h[a]};
	h[a] = idx;
}
void tarjan(int u) {
	dfn[u] = low[u] = ++tot;
	stk[++top] = u;
	vis[u] = 1;
	for (int i = h[u]; i;i=e[i].ne) {
		int v = e[i].v;
		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]) {
		int y;
		cnt++;
		while (1) {
			y = stk[top];
			new_g[y] = cnt;
			top--;
			vis[y] = 0;
			if (y == u)break;
		}
	}
}
int main() {
	cin >> n>>m;
	for (int k = 1; k <= m;k++) {
		int i,a,j, b;
		scanf("%d%d%d%d",&i,&a,&j,&b);
		add(i*2+!a,j*2+b);
		add(j*2+!b,i*2+a);
	}

	for(int i=1;i<=n*2;i++)
	if(!dfn[i])tarjan(i);

	for (int i = 1; i <= n;i++) {
		if (new_g[i*2]==new_g[i*2+1]) {
			puts("IMPOSSIBLE");
			return 0;
		}
		
	}
	puts("POSSIBLE");
	for (int i = 1; i <= n ; i++) {

		if (new_g[i*2] < new_g[i*2 + 1]) {
			printf("0 ");
		}
		else printf("1 ");

	
	}
	return 0;
}
2024/4/26 16:53
加载中...