Pagini recente » Cod sursa (job #2906389) | Cod sursa (job #2864961) | Cod sursa (job #2979921) | Cod sursa (job #900745) | Cod sursa (job #2894127)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAX_N = 20001;
vector<int> edges[MAX_N];
int p[MAX_N];
bool viz[MAX_N];
int n, m, e;
bool dfs(int u) {
viz[u] = 1;
for (int v : edges[u])
if (!p[v]) {
p[v] = u;
p[u] = v;
return 1;
}
for (int v : edges[u]) {
if (viz[v]) continue;
viz[v] = 1;
if (dfs(p[v])) {
p[v] = u;
p[u] = v;
return 1;
}
}
return 0;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
cin >> n >> m >> e;
for (int i = 0; i < e; i++) {
int a, b;
cin >> a >> b;
b += n;
edges[a].push_back(b);
edges[b].push_back(a);
}
int cnt = 0;
bool g = true;
while (g) {
for (int i = 1; i <= n + m; i++)
viz[i] = 0;
g = 0;
for (int i = 1; i <= n; i++) {
if (viz[i] || p[i])
continue;
if (dfs(i)) {
g = 1;
cnt++;
}
}
}
cout << cnt << '\n';
for (int i = 1; i <= n; i++)
if (p[i])
cout << i << ' ' << p[i] - n << '\n';
return 0;
}