結果
問題 | No.1744 Selfish Spies 1 (à la Princess' Perfectionism) |
ユーザー |
![]() |
提出日時 | 2021-11-14 22:23:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 174 ms / 5,000 ms |
コード長 | 2,543 bytes |
コンパイル時間 | 2,861 ms |
コンパイル使用メモリ | 241,396 KB |
最終ジャッジ日時 | 2025-01-25 18:20:26 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 39 |
ソースコード
#include<bits/stdc++.h>namespace {#pragma GCC diagnostic push#pragma GCC diagnostic ignored "-Wunused-function"#include<atcoder/all>#pragma GCC diagnostic popusing namespace std;using namespace atcoder;#define rep(i,n)for (int i = 0; i < int(n); ++i)#define rrep(i,n)for (int i = int(n)-1; i >= 0; --i)#define all(x) (x).begin(), (x).end()#define rall(x) (x).rbegin(), (x).rend()template<class T> void chmax(T& a, const T& b) { a = max(a, b); }template<class T> void chmin(T& a, const T& b) { a = min(a, b); }using ll = long long;using P = pair<int,int>;using VI = vector<int>;using VVI = vector<VI>;using VL = vector<ll>;using VVL = vector<VL>;} int main() {ios::sync_with_stdio(false);cin.tie(0);int n, m, l;cin >> n >> m >> l;int s = n + m, t = s + 1;mf_graph<int> g(t + 1);rep(i, l) {int s, t;cin >> s >> t;s--, t--;g.add_edge(s, n + t, 1);}rep(i, n) g.add_edge(s, i, 1);rep(i, m) g.add_edge(n + i, t, 1);g.flow(s, t);scc_graph scc(n + m);// VVI to(n + m);VI ans(l);rep(i, l) {auto e = g.get_edge(i);if (e.flow) {scc.add_edge(e.to, e.from);} else {ans[i] = true;scc.add_edge(e.from, e.to);}}auto cs = scc.scc();dsu uf(n + m);for(auto c: cs) {int l = c[0];for(int x: c) uf.merge(x, l);}rep(i, l) {auto e = g.get_edge(i);if (uf.same(e.from, e.to)) ans[i] = true;}auto min_cut = g.min_cut(s);VVI to(n + m);map<P, int> mp;rep(i, l) {auto e = g.get_edge(i);if (min_cut[e.from] != min_cut[e.to]) continue;mp[{e.from, e.to}] = mp[{e.to, e.from}] = i;if (!min_cut[e.from] ^ e.flow) {to[e.to].push_back(e.from);// cout << e.to << ' ' << e.from << endl;} else {// cout << e.from << ' ' << e.to << endl;to[e.from].push_back(e.to);}}VI indeg(n + m);rep(i, n + m) for(int j: to[i]) indeg[j]++;VI st;VI visited(n + m);rep(i, n + m) {if (min_cut[i]) {if (i < n && indeg[i] == 0) {// cout << "aa" << endl;st.push_back(i);visited[i] = true;}} else {if (i >= n && indeg[i] == 0) {// cout << "bb" << endl;st.push_back(i);visited[i] = true;}}}while(st.size()) {int u = st.back(); st.pop_back();for(int v: to[u]) {ans[mp[{u, v}]] = true;if (!visited[v]) {visited[v] = true;st.push_back(v);}}}rep(i, l) cout << (ans[i] ? "Yes\n" : "No\n");}