Pagini recente » Cod sursa (job #3003367) | Cod sursa (job #52849) | Cod sursa (job #2031650) | Cod sursa (job #1174325) | Cod sursa (job #253363)
Cod sursa(job #253363)
#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "cuplaj.in"
#define FOUT "cuplaj.out"
#define MAX_N 10005
typedef struct NOD
{
int nod;
NOD *next;
};
NOD *A[MAX_N];
int dest[MAX_N];
int p[MAX_N];
int v[MAX_N];
int N, M, e;
int cnt;
int pairup (int nod)
{
v[nod] = 1;
for (NOD *q = A[nod]; q != NULL; q = q->next)
if (!dest[q->nod])
{
dest[q->nod] = nod;
p[nod] = q->nod;
return 1;
}
for (NOD *q = A[nod]; q != NULL; q = q->next)
if (!v[dest[q->nod]])
if (pairup(dest[q->nod]))
{
dest[q->nod] = nod;
p[nod] = q->nod;
return 1;
}
return 0;
}
void cuplaj ()
{
int ok, i;
ok = 1;
while (ok)
{
ok = 0;
memset (v, 0, sizeof (v));
for (i = 1; i <= N; ++i)
if (!p[i])
if (pairup (i))
{
ok = 1;
++cnt;
}
}
printf ("%d\n", cnt);
for (i = 1; i <= N; ++i)
if (p[i]) printf ("%d %d\n", i, p[i]);
}
int main ()
{
int i, a, b;
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d %d", &N, &M, &e);
for (i = 1; i <= e; ++i)
{
scanf ("%d %d", &a, &b);
NOD *q = new (NOD);
q->nod = b, q->next = A[a], A[a] = q;
}
cuplaj ();
return 0;
}