Pagini recente » Borderou de evaluare (job #3159968) | Cod sursa (job #1001916) | Cod sursa (job #141996) | Cod sursa (job #3269478) | Cod sursa (job #351529)
Cod sursa(job #351529)
#include <vector>
#include <iostream>
#include <cstring>
using namespace std;
const int NMAX = 100001;
vector<int> lv[NMAX];
bool vis[NMAX];
int l[NMAX], r[NMAX];
bool cupleaza(int nod) {
if (vis[nod])
return false;
vis[nod] = true;
for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it)
if (!r[*it]) {
l[nod] = *it;
r[*it] = nod;
return true;
}
for (vector<int>::iterator it = lv[nod].begin(); it != lv[nod].end(); ++it) {
if (r[*it] && cupleaza(r[*it])) {
l[nod] = *it;
r[*it] = nod;
return true;
}
}
return false;
}
int main() {
FILE* fin = fopen("cuplaj.in", "r");
FILE* fout = fopen("cuplaj.out", "w");
int n1, n2, m;
fscanf(fin, "%d%d%d", &n1, &n2, &m);
while (m--) {
int a, b;
fscanf (fin,"%d%d", &a, &b);
lv[a].push_back(b);
}
bool ok = true;
int ret = 0;
while (ok) {
ok = false;
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n1; ++i) {
if (!l[i] && cupleaza(i)) {
ret++;
ok = true;
}
}
}
fprintf (fout, "%d\n", ret);
for (int i = 1; i <= n1; ++i)
if (l[i] != 0) {
fprintf (fout, "%d %d\n", i, l[i]);
}
fclose(fout);
return 0;
}