Pagini recente » Cod sursa (job #2261317) | Cod sursa (job #1353991) | Cod sursa (job #1981769) | Cod sursa (job #196898) | Cod sursa (job #3137044)
#include<bits/stdc++.h>
using namespace::std;
void setIO(string name) {
string input = name + ".in";
string output = name + ".out";
freopen(input.c_str(), "r", stdin);
freopen(output.c_str(), "w", stdout);
}
struct BipartiteMatcher {
vector<vector<int>> g;
vector<int> L, R;
vector<bool> vis;
BipartiteMatcher(int n, int m):
g(n), L(n, -1), R(m, -1), vis(n) {}
void addEdge(int a, int b) {
g[a].emplace_back(b);
}
bool match(int x) {
if (vis[x]) return 0;
vis[x] = 1;
for (int v : g[x])
if (R[v] == -1)
return R[L[x]=v]=x, 1;
for (int v : g[x])
if (match(R[v]))
return R[L[x]=v]=x, 1;
return 0;
}
int solve() {
int cnt = 1;
//vector<int> ind(L.size());
//for (int i = 0; i < ind.size(); ++i) {
// ind[i] = 1;
//}
//shuffle(ind.begin(), ind.end(), rng);
while (cnt--) {
fill(vis.begin(), vis.end(), 0);
for (int i = 0; i < L.size(); ++i) {
cnt |= L[i] == -1 and match(i);
}
}
int res = 0;
for (int i = 0; i < L.size(); ++i) {
res += L[i] != -1;
}
return res;
}
};
int main() {
setIO("cuplaj");
int n, m, e;
scanf("%d %d %d", &n, &m, &e);
BipartiteMatcher Solver(n, m);
for(int i = 0; i < e; i++) {
int u, v;
scanf("%d %d", &u, &v);
u--; v--;
Solver.addEdge(u, v);
}
printf("%d\n", Solver.solve());
for(int i = 0; i < n; i++) {
if(Solver.L[i] == -1) continue;
printf("%d %d\n", i + 1, Solver.L[i] + 1);
}
return 0;
}