全WA求调,悬关
查看原帖
全WA求调,悬关
509310
LiAuPb楼主2024/1/13 14:17

过得了样例。 data:

#include<bits/stdc++.h>
#define N 2000010
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;
bool vis[N];
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;
	vis[u] = true;
	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(vis[v]) low[u] = min(low[u], dfn[v]);
	}
	if(dfn[u] == low[u]){
		cnt++;
		while(true){
			int t = st[top--];
			col[t] = cnt;
			vis[t] = false;
			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);
		if(a && b){
			add(u, v + n);
			add(v, u + n);
		}
		else if(a && !b){
			add(u, v);
			add(v + n, u + n);
		}
		else if(!a && b){
			add(u + n, v + n);
			add(v, u);
		}
		else{
			add(u + n, v);
			add(v + n, u);
		}
	}
	for(int i = 1; i <= n << 1; 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++){
		if(col[i] < col[i + n]) printf("1 ");
		else printf("0 ");
	}
	return 0;
}
2024/1/13 14:17
加载中...