Pagini recente » Monitorul de evaluare | Cod sursa (job #3289719) | Cod sursa (job #3294048) | Diferente pentru implica-te/arhiva-educationala intre reviziile 216 si 223 | Cod sursa (job #3293891)
#include <bits/stdc++.h>
using namespace std;
const int kNil = -1;
struct kuhn {
int n, m;
vector<vector<int>> adj;
vector<int> l, r;
vector<bool> vis;
kuhn() {}
kuhn(int n, int m) : n(n), m(m), adj(n), l(m, kNil), r(n, kNil), vis(n) {}
void add_edge(int u, int v) {
adj[u].emplace_back(v);
}
bool pairup(int u) {
if(vis[u]) {
return false;
}
vis[u] = true;
for(const auto &it : adj[u]) {
if(l[it] == kNil) {
r[u] = it;
l[it] = u;
return true;
}
}
for(const auto &it : adj[u]) {
if(pairup(l[it])) {
r[u] = it;
l[it] = u;
return true;
}
}
return false;
}
int max_match() {
bool better = true;
while(better) {
better = false;
fill(vis.begin(), vis.end(), false);
for(int i = 0; i < n; i++) {
if(r[i] == kNil && pairup(i)) {
better = true;
}
}
}
int res = 0;
for(int i = 0; i < n; i++) {
if(r[i] != kNil) {
res++;
}
}
return res;
}
};
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
#ifdef INFOARENA
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
#endif
int n, m, e;
cin >> n >> m >> e;
kuhn graph(n, m);
for(int i = 0; i < e; i++) {
int u, v;
cin >> u >> v;
u--; v--;
graph.add_edge(u, v);
}
cout << graph.max_match() << '\n';
for(int i = 0; i < n; i++) {
if(graph.r[i] != kNil) {
cout << i + 1 << " " << graph.r[i] + 1 << '\n';
}
}
return 0;
}