Pagini recente » Cod sursa (job #2576700) | Cod sursa (job #1070134) | Cod sursa (job #1481135) | Cod sursa (job #2614863) | Cod sursa (job #2847378)
#include <bits/stdc++.h>
using namespace std;
#ifdef INFOARENA
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#else
ifstream fin("ciorna.in");
ofstream fout("ciorna.out");
#endif // INFOARENA
class Matcher {
int n, m;
vector <int> l, r;
vector <vector <int>> g;
vector <bool> up;
bool pairup(int u) {
if(up[u]) return false;
up[u] = true;
for(int v : g[u]) if(!l[v])
return r[l[v] = u] = v;
for(int v : g[u]) if(pairup(l[v]))
return r[l[v] = u] = v;
return false;
}
public:
Matcher (int _n, int _m) : n(_n), m(_m), l(_m + 1, 0), r(_n + 1, 0), g(_n + 1), up(_n + 1) {}
void add_edge(int u, int v) {
g[u].push_back(v);
}
vector <pair <int, int>> match() {
for(bool ok = true; ok;) {
ok = false; fill(up.begin(), up.end(), false);
for(int u = 1; u <= n; u++) if(!r[u])
ok |= pairup(u);
}
vector <pair <int, int>> sol;
for(int u = 1; u <= n; u++)
if(l[r[u]] == u)
sol.emplace_back(u, r[u]);
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);
vector <pair <int, int>> sol = M.match();
fout << sol.size() << "\n";
for(auto p : sol)
fout << p.first << " " << p.second << "\n";
return 0;
}