Pagini recente » Cod sursa (job #177228) | Cod sursa (job #1031177) | Cod sursa (job #1421412) | Cod sursa (job #540919) | Cod sursa (job #2635938)
#include <stdio.h>
#include <cstring>
#include <utility>
#include <vector>
#include <time.h>
#define NMAX 20005
using namespace std;
FILE* fin, * fout;
int n, m, e;
vector<int> g[NMAX];
bool viz[NMAX] = { 0 };
int match[NMAX] = { 0 };
bool dfs(int u) {
for (auto v : g[u]) {
if (!viz[v]) {
viz[v] = true;
if (match[v] == 0 || dfs(match[v])) {
match[v] = u;
return true;
}
}
}
return false;
}
void maximumMatching() {
int res = 0;
for (int i = n + 1;i <= n + m;++i) {
if (!dfs(i)) {
memset(viz, 0, sizeof(viz));
res += dfs(i);
}
else ++res;
}
printf(fout, "%i\n", res);
for (int i = 1;i <= n;++i)
if (match[i] != 0)
printf(fout, "%i %i\n", i, match[i] - n);
}
int main() {
clock_t t = clock();
fin = fopen("cuplaj.in", "r");
fout = fopen("cuplaj.out", "w");
fscanf(fin, "%i %i %i", &n, &m, &e);
while (e--) {
int x, y;
fscanf(fin, "%i %i", &x, &y);
g[x].push_back(y + n);
g[y + n].push_back(x);
}
maximumMatching();
printf("%f", (float)(clock() - t) / CLOCKS_PER_SEC);
return 0;
}