![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;
}