Pagini recente » Cod sursa (job #86120) | Cod sursa (job #1114460) | Cod sursa (job #634400) | Cod sursa (job #1976217) | Cod sursa (job #398751)
Cod sursa(job #398751)
#include <cstdio>
#include <vector>
using namespace std;
#define Nmax 10010
void citire ();
int l, r, m, i, n;
int viz[Nmax], L[Nmax], R[Nmax];
vector <int> V[Nmax];
int cuplaj (int nod) {
if (viz[nod]) return 0;
viz[nod] = 1; int i;
for (i = 0; i < (int) V[nod].size (); i++)
if (!L[ V[nod][i] ]) {
R[nod] = V[nod][i];
L[ V[nod][i] ] = nod;
return 1;
}
for (i = 0; i < (int) V[nod].size (); i++)
if (L[ V[nod][i] ] && cuplaj ( L[V[nod][i]] ) ) {
R[nod] = V[nod][i];
L[ V[nod][i] ] = nod;
return 1;
}
return 0;
}
int main () {
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
citire ();
for (int ok = 1; ok; ) {
ok = 0;
memset (viz, 0, sizeof (viz));
for (i = 1; i <= l; i++)
if (!R[i])
if ( cuplaj (i) ) ok = 1;
}
int sol = 0;
for (i = 1; i <= l; i++)
if (R[i]) sol++;
printf ("%d\n", sol);
for (i = 1; i <= l; i++)
if (R[i]) printf ("%d %d\n", i, R[i]);
return 0;
}
void citire () {
int i, x, y;
scanf ("%d %d %d", &l, &r, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d", &x, &y);
V[x].push_back (y);
}
}