点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
vector<vector<int>>g(2*n);
for(int i=0;i<m;i++){
int x,a,y,b;
cin>>x>>a>>y>>b;
x--,y--;
g[x+(a^1)*n].push_back(y+b*n);
g[y+(b^1)*n].push_back(x+a*n);
}
vector<int>scc(2*n),ins(2*n),dfn(2*n),low(2*n);
int idx=0,cnt=0;
stack<int>stk;
auto dfs=[&](auto &&self,int x)->void{
dfn[x]=low[x]=++idx;
stk.push(x);
ins[x]=1;
for(auto y:g[x]){
if(!dfn[y]){
self(self,y);
low[x]=min(low[x],low[y]);
}else if(ins[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]){
int y;
cnt++;
do{
y=stk.top();
stk.pop();
ins[y]=0;
scc[y]=cnt;
}while(y!=x);
}
return ;
};
for(int i=0;i<2*n;i++){
if(!dfn[i]){
dfs(dfs,i);
}
}
vector<int>ans(n);
for(int i=0;i<n;i++){
if(scc[i]==scc[i+n]){
cout<<"IMPOSSIBLE"<<'\n';
return 0;
}else if(scc[i]>scc[i+n]){
ans[i]=1;
}
}
cout<<"POSSIBLE"<<"\n";
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
}