diff --git a/graph/bigraph-match.cc b/graph/bigraph-match.cc new file mode 100644 index 0000000..26c674c --- /dev/null +++ b/graph/bigraph-match.cc @@ -0,0 +1,58 @@ +// uoj-78.cc + +#include +using namespace std; + +int main() { + ios_base::sync_with_stdio(0), cin.tie(NULL); + int nl, nr, m; + cin >> nl >> nr >> m; + vector> left(nl+1); + vector> right(nr+1); + vector choice_left(nl+1); + vector choice_right(nr+1); + vector vis(nl+1); + while(m--) { + int v, u; + cin >> v >> u; + left[v].push_back(u); + right[u].push_back(v); + } + function dfs = [&](int v) -> bool { + if (vis[v]) return false; + vis[v] = true; + for (auto&& u : left[v]) { + if (choice_right[u]) { + int t = choice_right[u]; + if (dfs(t)) { + choice_left[v] = u; + choice_right[u] = v; + vis[v] = false; + return true; + } + } else { + choice_left[v] = u; + choice_right[u] = v; + vis[v] = false; + return true; + } + } + return false; + }; + for (int i = 1; i <= nl; ++i) { + if (!choice_left[i]) { + dfs(i); + } + } + vector res; + int cnt = 0; + for (int i = 1; i <= nl; ++i) { + if (choice_left[i]) { + ++cnt; + } + res.push_back(choice_left[i]); + } + cout << cnt << endl; + for (auto&& j : res) + cout << j << ' '; +}