Pagini recente » Cod sursa (job #1054138) | Cod sursa (job #2257509) | Cod sursa (job #1729205) | Cod sursa (job #1858407) | Cod sursa (job #996587)
Cod sursa(job #996587)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
short n, m;
#define MAXN 10005
typedef vector <short>::iterator iter;
FILE* f = fopen ("cuplaj.in", "r");
FILE* g = fopen ("cuplaj.out", "w");
vector <short> G[MAXN];
bitset <MAXN> viz;
short p[MAXN], r[MAXN];
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(f, "%hd %hd %d\n", &n, &m, &e);
short x, y;
for (int i = 0; i < e; ++i) {
fscanf (f, "%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 (g, "%d\n", num);
for (short i = 1; i <= n; ++i)
if (p[i])
fprintf (g, "%hd %hd\n", i, p[i]);
fclose (f);
fclose (g);
return 0;
}