Pagini recente » Cod sursa (job #1274881) | Cod sursa (job #1702934) | Cod sursa (job #81456) | Cod sursa (job #1382685) | Cod sursa (job #3041052)
#include <bits/stdc++.h>
const int NMAX = 2e4 + 5;
int n, m, K, f[NMAX], cp[NMAX];
std :: vector < int > G[NMAX];
bool match(int node) {
if (f[node] == true)
return false;
f[node] = true;
for (int i = 0; i < G[node].size(); ++ i) {
int u = G[node][i];
if (cp[u] == 0) {
cp[node] = u;
cp[u] = node;
return true;
}
}
for (int i = 0; i < G[node].size(); ++ i) {
int u = G[node][i];
if (cp[u] != 0) {
int v = cp[u];
cp[node] = u;
cp[u] = node;
cp[v] = 0;
if (match(v) == true)
return true;
else {
cp[node] = 0;
cp[u] = v;
cp[v] = u;
}
}
}
return false;
}
std :: ifstream fin("cuplaj.in");
std :: ofstream fout("cuplaj.out");
int main() {
fin >> n >> m >> K;
for (int i = 1, u, v; i <= K; ++ i) {
fin >> u >> v;
v += n;
G[u].push_back(v);
G[v].push_back(u);
}
while (1) {
for (int i = 1; i <= n + m; ++ i)
f[i] = false;
bool ok = false;
for (int i = 1; i <= n; ++ i)
if (cp[i] == 0 && match(i) == true)
ok = true;
if (ok == false)
break;
}
int cnt = 0;
for (int i = 1; i <= n; ++ i)
if (cp[i] != 0)
++ cnt;
fout << cnt << "\n";
for (int i = 1; i <= n; ++ i)
if (cp[i] != 0)
fout << i << " " << cp[i] - n << "\n";
return 0;
}