Pagini recente » Cod sursa (job #2353224) | Cod sursa (job #1188529) | Cod sursa (job #2304736) | Cod sursa (job #2455010) | Cod sursa (job #2870872)
#include <bits/stdc++.h>
using namespace std;
#ifndef HOME
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#else
ifstream fin("ciorna.in");
ofstream fout("ciorna.out");
#endif
class Matcher {
int n, m;
vector <int> l, r;
vector <bool> upd;
vector <vector <int>> g;
inline bool pairup(int u) {
if(upd[u]) return false;
upd[u] = true;
for(int v : g[u]) if(!l[v])
return l[r[u] = v] = u, true;
for(int v : g[u]) if(pairup(l[v]))
return l[r[u] = v] = u, true;
return false;
}
public:
Matcher(int n, int m) : n(n), m(m), r(n + 1, 0), l(m + 1, 0), upd(n + 1, false), g(n + 1) {}
void add_edge(int u, int v) { g[u].push_back(v); }
vector <pair <int, int>> match() {
for(bool ok = true; ok; fill(upd.begin(), upd.end(), false)) {
ok = false;
for(int i = 1; i <= n; i++) if(!r[i])
ok |= pairup(i);
}
vector <pair <int, int>> sol;
for(int i = 1; i <= n; i++) if(r[i])
sol.emplace_back(i, r[i]);
return sol;
}
};
int main()
{
int n, m, e, u, v;
fin >> n >> m >> e;
Matcher M(n, m);
for(int i = 1; i <= e; i++) {
fin >> u >> v;
M.add_edge(u, v);
}
auto mat = M.match();
fout << mat.size() << "\n";
for(auto p : mat)
fout << p.first << " " << p.second << "\n";
return 0;
}