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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| struct SCC { int n; std::vector<std::vector<int>> edges; std::vector<int> stk; std::vector<int> dfn, low, bel; int cur, cnt;
SCC() {} SCC(int n) { init(n); }
void init(int n) { this -> n = n; edges.assign(n, {}); stk.clear(); dfn.assign(n, -1); low.resize(n); bel.assign(n, -1); cur = cnt = 0; }
void addEdge(int u, int v) { edges[u].push_back(v); }
void dfs(int x) { dfn[x] = low[x] = cur ++ ; stk.push_back(x);
for (auto y : edges[x]) { if (dfn[y] == -1) { dfs(y); low[x] = std::min(low[x], low[y]); } else if (bel[y] == -1) { low[x] = std::min(low[x], dfn[y]); } }
if (dfn[x] == low[x]) { int y; do { y = stk.back(); bel[y] = cnt; stk.pop_back(); } while (y != x); cnt ++ ; } }
std::vector<int> work() { for (int i = 0; i < n; i++) { if (dfn[i] == -1) { dfs(i); } } return bel; }
};
void solve() { int n, m; std::cin >> n >> m; SCC g(2 * n); for (int i = 0; i < m; i++) { int u, c_u, v, c_v; std::cin >> u >> c_u >> v >> c_v; u -- , v -- ; if (c_u && c_v) { g.addEdge(n + u, v); g.addEdge(n + v, u); } else if (!c_u && c_v) { g.addEdge(u, v); g.addEdge(n + v, n + u); } else if (c_u && !c_v) { g.addEdge(n + u, n + v); g.addEdge(v, u); } else { g.addEdge(u, n + v); g.addEdge(v, n + u); } }
g.work();
for (int i = 0; i < n; i++) { if (g.bel[i] == g.bel[n + i]) { std::cout << "IMPOSSIBLE\n"; return ; } }
std::cout << "POSSIBLE\n"; for (int i = 0; i < n; i++) { if (g.bel[i] < g.bel[n + i]) { std::cout << "1 "; } else { std::cout << "0 "; } }
std::cout << "\n";
}
|