int n, m, s, cnt; int op[kMaxN]; std::set<std::pair<int, int>> G[kMaxN], rG[kMaxN]; std::queue<int> q; std::vector<int> vec; bool del[kMaxN];
voidtopo(){ for (; !q.empty(); q.pop()) { int u = q.front(); if (del[u]) continue; del[u] = 1; for (auto [v, id] : rG[u]) { if (del[v]) continue; G[v].erase({u, id}); if (!G[v].size()) q.emplace(v); } } }
voiddfs(int u, int lst){ if (u == s && !cnt && lst != -1) return; // std::cerr << u << ' ' << lst << ' ' << cnt << '\n'; for (auto [v, id] : G[u]) { if (id == lst) continue; cnt += (!op[id] ? 1 : -1), op[id] ^= 1, vec.emplace_back(id); G[u].erase({v, id}), G[v].emplace(u, id); returndfs(v, id); } }
std::variant<bool, std::vector<int>> find_journey(int N, int M, std::vector<int> U, std::vector<int> V) { n = N, m = M; for (int i = 0; i < m; ++i) { op[i] = 0, G[U[i]].emplace(V[i], i), rG[V[i]].emplace(U[i], i); } for (int i = 0; i < n; ++i) if (!G[i].size()) q.emplace(i); topo(); // std::cerr << s << ' ' << G[s].size() << '\n'; s = 0; std::vector<int> tmp; for (; G[s].size() == 1;) { auto [nxt, id] = *G[s].begin(); // std::cerr << "shabi " << s << ' ' << nxt << ' ' << id << '\n'; q.emplace(s), tmp.emplace_back(id), s = nxt; topo(); } if (!G[s].size() || del[s]) returnfalse; for (int i = 0; i < n; ++i) { for (; G[i].size() > (i == s) + 1; G[i].erase(G[i].begin())) {} } dfs(s, -1); std::vector<int> res = tmp; for (auto x : vec) res.emplace_back(x); std::reverse(tmp.begin(), tmp.end()); for (auto x : tmp) res.emplace_back(x); // std::cerr << "??? " << tmp[0] << ' ' << res[0] << '\n'; // for (auto x : res) std::cerr << x << ' '; // std::cerr << '\n'; return res; }