Pagini recente » Cod sursa (job #3292547) | Cod sursa (job #518437) | Cod sursa (job #3207308) | Cod sursa (job #728234) | Cod sursa (job #568141)
Cod sursa(job #568141)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
short n, m;
#define MAXN 10005
vector <short> g [MAXN];
bitset <MAXN> viz;
short p[MAXN], r[MAXN];
typedef vector <short>::iterator iter;
FILE* fin = fopen ("cuplaj.in", "r");
FILE* fout = fopen ("cuplaj.out", "w");
bool match (short i)
{
if (viz[i])
return false;
viz[i] = true;
for (iter it = g[i].begin (); it != g[i].end (); ++it) {
if (!r[*it]) {
p[i] = *it;
r[*it] = i;
return true;
}
}
for (iter it = g[i].begin (); it != g[i].end (); ++it) {
if (match (r [*it])) {
p[i] = *it;
r[*it] = i;
return true;
}
}
return false;
}
int main ()
{
int e;
fscanf (fin, "%hd %hd %d\n", &n, &m, &e);
short x, y;
for (int i = 0; i < e; ++i) {
fscanf (fin, "%hd %hd\n", &x, &y);
g[x].push_back (y);
}
bool ok = true;
while (ok) {
ok = false;
viz.reset ();
for (short i = 1; i <= n; ++i) {
if (!p[i])
ok |= match (i);
}
}
int num = 0;
for (short i = 1; i <= n; ++i)
if (p[i])
++num;
fprintf (fout, "%d\n", num);
for (short i = 1; i <= n; ++i)
if (p[i])
fprintf (fout, "%hd %hd\n", i, p[i]);
fclose (fin);
fclose (fout);
return 0;
}