![image]()
![image]()
洛谷p4782
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n,m;
int dfn[N],low[N],stk[N],instk[N],tot,cnt,scc[N],top;
vector<int> edges[N];
void tarjan(int u){
dfn[u]=low[u]=++tot;
stk[++top]=u;
instk[u]=1;
for(int &v:edges[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instk[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
int v;
cnt++;
do{
v=stk[top--];
instk[v]=0;
scc[v]=cnt;
}while(v^u);
}
}
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin>>n>>m;
while(m--){
int i,a,j,b;
cin>>i>>a>>j>>b;
edges[i+!a*n].push_back(j+b*n);
edges[j+!b*n].push_back(i+a*n);
}
for(int i=1;i<=n+n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=n;i++){
if(scc[i]==scc[i+n]){
cout<<"IMPOSSIBLE"<<endl;
return 0;
}
}
cout<<"POSSIBLE"<<endl;
for(int i=1;i<=n;i++){
cout<<(scc[i]>scc[i+n])<<' ';
}
return 0;
}