2-SAT模板90pts求调
查看原帖
2-SAT模板90pts求调
763878
Jerry_heng楼主2024/2/25 10:11
#include<bits/stdc++.h>
using namespace std;
const int mxn=4e6+10;
int head[mxn],cnt,cnt2,col,n,m,dfn[mxn],low[mxn],be[mxn];
bool vis[mxn];
stack<int>st;
struct node{
	int to,nxt;
}edge[mxn];
void add(int u,int v){
	edge[++cnt]=(node){v,head[u]};
	head[u]=cnt;
}
void tarjan(int u){
	dfn[u]=low[u]=++cnt2;
	st.push(u);vis[u]=1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],dfn[u]);
	}
	if(dfn[u]==low[u]){
		col++;
		while(st.top()!=u){
			be[st.top()]=col;
			vis[st.top()]=0;
			st.pop();
		}
		be[st.top()]=col;
		vis[st.top()]=0;
		st.pop();
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,a,b;
		scanf("%d%d%d%d",&x,&a,&y,&b);
		add(x+n*a,y+n*(b^1));
		add(y+n*b,x+n*(a^1));
	}
	for(int i=1;i<=2*n;i++)
		if(!dfn[i])tarjan(i);
	for(int i=1;i<=n;i++)
		if(be[i]==be[i+n]){
			puts("IMPOSSIBLE");
			return 0;
		}
	puts("POSSIBLE");
	for(int i=1;i<=n;i++)
		printf("%d ",(be[i]<be[i+n]));
	return 0;
} 
2024/2/25 10:11
加载中...