1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<queue> using namespace std;
const int CN = 4e6 + 6;
int read(){ int s = 0,ne = 1; char c = getchar(); while(c < '0' || c > '9') ne = c == '-' ? -1 : 1, c = getchar(); while(c >= '0' && c <= '9') s = (s << 1) + (s << 3) + c - '0', c = getchar(); return s * ne; }
class fs {public: int to,nxt; void init(int t,int n) {to = t, nxt = n;} } E[CN]; int hd[CN], ecnt = 0; void add(int x,int y) {E[++ecnt].init(y, hd[x]),hd[x] = ecnt;}
int n, m, du[CN];
int dfn[CN], low[CN], idx = 0, stk[CN], top = 0, bel[CN], bcnt = 0; bool ins[CN]; void dfs(int u){ dfn[u] = low[u] = ++idx, stk[++top] = u, ins[u] = true; for(int k = hd[u]; k; k = E[k].nxt){ int v = E[k].to; if(!dfn[v]) dfs(v), low[u] = min(low[u], low[v]); else if(ins[v]) low[u] = min(low[u], low[v]); } if(low[u] == dfn[u]){ bcnt++; int pos = 0; while(pos ^ u) pos = stk[top--], ins[pos] = false, bel[pos] = bcnt; } }
int main() { freopen("_in.in", "r", stdin);
n = read(), m = read(); while(m--){ int i = read(), a = read(), j = read(), b = read(); if(a ^ b){ if(a > b) swap(i, j), swap(a, b); add(i, j), add(j + n, i + n); } else{ if(!a) add(i, j + n), add(j, i + n); else add(i + n, j), add(j + n, i); } }
for(int i = 1; i <= (n << 1); i++) if(!dfn[i]) dfs(i); bool flag = true; for(int i = 1; i <= n && flag; i++) flag &= (bel[i] != bel[i + n]);
if(!flag) puts("IMPOSSIBLE"); else{ puts("POSSIBLE"); for(int i = 1; i <= n; i++) if(bel[i] < bel[i + n]) printf("1 "); else printf("0 "); } }
|