核心:每个点两个状态,翻译或非且的关系
D
F
S
DFS
DFS 即可,因为每个点状态只有两个,不会搜索很多次
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<cmath>
#include<cstring>
#include<cstdio>
#include <iomanip>
#include<climits>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define LD long double
int read(){
int f=0,x=0;char c=getchar();
while(c<'0'||'9'<c){if(c=='-')f=1;c=getchar();}
while('0'<=c&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return !f?x:-x;
}
#define mp make_pair
const int MAXN=2000000;
vector<int> G[MAXN+5];
int stk[MAXN+5],tp;
void Addedge(int u,int v){
G[u].push_back(v);
// printf("%d %d\n",u,v);
return ;
}
bool vis[MAXN+5];
bool DFS(int u){
if(vis[u^1]) return 0;
if(vis[u]) return 1;
//if(u<2*N&&vis[u^1])
// return 0;
vis[u]=1,stk[++tp]=u;
for(int i=0;i<(int)G[u].size();i++)
if(!DFS(G[u][i]))
return 0;
return 1;
}
bool Solve(int n){
for(int i=0;i<2*n;i+=2){
if(vis[i]||vis[i^1])
continue;
tp=0;
if(!DFS(i)){
while(tp)
vis[stk[tp--]]=0;
if(!DFS(i^1))
return 0;
}
}
return 1;
}
int main(){
int n=read(),m=read();
for(int i=1;i<=m;i++){
int p=read()-1,a=read(),q=read()-1,b=read();
Addedge((p<<1)|(!a),(q<<1)|b);
Addedge((q<<1)|(!b),(p<<1)|a);
}
if(!Solve(n))
puts("IMPOSSIBLE"),exit(0);
puts("POSSIBLE");
for(int i=0;i<2*n;i+=2)
if(vis[i])
printf("0 ");
else
printf("1 ");
return 0;
}