LUOGU_4782_【模板】2-SAT 问题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mx=4e6+5;
int n,m,num,cnt,val[mx],c[mx],dfn[mx],vis[mx],low[mx],s[mx],tp;
char op[10];
vector<int> g[mx];
void tarjan(int x) {
dfn[x]=low[x]=++num,vis[x]=1,s[++tp]=x;
for(auto z:g[x]) {
if(!dfn[z]) {
tarjan(z),low[x]=min(low[x],low[z]);
}
else if(vis[z]) low[x]=min(low[x],dfn[z]);
}
if(dfn[x]==low[x]) {
cnt++;
int tmp=0;
do{
tmp=s[tp--];
c[tmp]=cnt,vis[tmp]=0;
}while(tmp!=x);
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
int x,a,y,b; scanf("%d%d%d%d",&x,&a,&y,&b);
x=x*2-1,y=y*2-1;
g[x^a^1].push_back(y^b);
g[y^b^1].push_back(x^a);
}
for(int i=0;i<2*n;i++) {
if(!low[i]) {
tarjan(i);
}
}
for(int i=0;i<n*2;i++) {
if(c[i]==c[i^1]) {
printf("IMPOSSIBLE");
return 0;
}
}
printf("POSSIBLE\n");
for(int i=0;i<n*2;i++) {
val[i]=c[i]<c[i^1];
}
for(int i=0;i<n*2;i+=2) {
printf("%d ",val[i]);
}
}