結果
問題 | No.8107 Listening |
ユーザー |
👑 |
提出日時 | 2024-04-01 21:49:36 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,439 bytes |
コンパイル時間 | 5,055 ms |
コンパイル使用メモリ | 270,756 KB |
最終ジャッジ日時 | 2025-02-20 19:06:43 |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | WA * 16 TLE * 3 -- * 21 |
ソースコード
#include<bits/stdc++.h>#include<atcoder/all>#define rep(i,n) for(int i=0;i<n;i++)using namespace std;using namespace atcoder;typedef long long ll;typedef vector<int> vi;typedef vector<long long> vl;typedef vector<vector<int>> vvi;typedef vector<vector<long long>> vvl;typedef long double ld;typedef pair<int, int> P;ostream& operator<<(ostream& os, const modint& a) {os << a.val(); return os;}template <int m> ostream& operator<<(ostream& os, const static_modint<m>& a) {os << a.val(); return os;}template <int m> ostream& operator<<(ostream& os, const dynamic_modint<m>& a) {os << a.val(); return os;}template<typename T> istream& operator>>(istream& is, vector<T>& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;}template<typename U, typename T> ostream& operator<<(ostream& os, const pair<U, T>& p){os << p.first << ' ' << p.second; return os;}template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); returnos;}template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : "");return os;}template<typename T> void chmin(T& a, T b){a = min(a, b);}template<typename T> void chmax(T& a, T b){a = max(a, b);}//https://ei1333.github.io/library/graph/flow/gabow-edmonds.hpp.html// https://qiita.com/Kutimoti_T/items/5b579773e0a24d650bdf/*** @brief Gabow Edmonds(一般グラフの最大マッチング)* @docs docs/gabow-edmonds.md*/struct GabowEdmonds {struct edge {int to, idx;};vector< vector< edge > > g;vector< pair< int, int > > edges;vector< int > mate, label, first;queue< int > que;GabowEdmonds(int n) : g(n + 1), mate(n + 1), label(n + 1, -1), first(n + 1) {}void add_edge(int u, int v) {++u, ++v;g[u].push_back((edge) {v, (int) (edges.size() + g.size())});g[v].push_back((edge) {u, (int) (edges.size() + g.size())});edges.emplace_back(u, v);}int find(int x) {if(label[first[x]] < 0) return first[x];first[x] = find(first[x]);return first[x];}void rematch(int v, int w) {int t = mate[v];mate[v] = w;if(mate[t] != v) return;if(label[v] < (int)g.size()) {mate[t] = label[v];rematch(label[v], t);} else {int x = edges[label[v] - g.size()].first;int y = edges[label[v] - g.size()].second;rematch(x, y);rematch(y, x);}}void assign_label(int x, int y, int num) {int r = find(x);int s = find(y);int join = 0;if(r == s) return;label[r] = -num;label[s] = -num;while(true) {if(s != 0) swap(r, s);r = find(label[mate[r]]);if(label[r] == -num) {join = r;break;}label[r] = -num;}int v = first[x];while(v != join) {que.push(v);label[v] = num;first[v] = join;v = first[label[mate[v]]];}v = first[y];while(v != join) {que.push(v);label[v] = num;first[v] = join;v = first[label[mate[v]]];}}bool augment_check(int u) {que = queue< int >();first[u] = 0;label[u] = 0;que.push(u);while(!que.empty()) {int x = que.front();que.pop();for(auto e : g[x]) {int y = e.to;if(mate[y] == 0 && y != u) {mate[y] = x;rematch(x, y);return true;} else if(label[y] >= 0) {assign_label(x, y, e.idx);} else if(label[mate[y]] < 0) {label[mate[y]] = x;first[mate[y]] = y;que.push(mate[y]);}}}return false;}vector< pair< int, int > > max_matching() {for(int i = 1; i < (int)g.size(); i++) {if(mate[i] != 0) continue;if(augment_check(i)) label.assign(g.size(), -1);}vector< pair< int, int > > ret;for(int i = 1; i < (int)g.size(); i++) {if(i < mate[i]) ret.emplace_back(i - 1, mate[i] - 1);}return ret;}};int main() {int N, M;cin >> N >> M;GabowEdmonds flow(N);map<pair<int, int>, int> ma;for(int i = 0; i < M; i++) {int a, b;cin >> a >> b;a--; b--;ma[make_pair(a, b)] = i;flow.add_edge(a, b);}auto ret = flow.max_matching();cout << ret.size() << endl;for(auto &p : ret) cout << ma[p] + 1 << endl;}