Pagini recente » Borderou de evaluare (job #589049) | Borderou de evaluare (job #2255376) | Cod sursa (job #2852323) | Cod sursa (job #1884623) | Cod sursa (job #871078)
Cod sursa(job #871078)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define maxN 10010
#define PB push_back
int ST[maxN], DR[maxN];
int cuplaj;
bool Viz[maxN];
vector <int> G[maxN];
bool cupleaza (int X)
{
if (Viz[X]) return false;
Viz[X] = true;
vector <int> :: iterator it;
for (it = G[X].begin(); it != G[X].end(); ++ it)
if (! ST[*it] || cupleaza (ST[*it]))
{
ST[*it] = X;
DR[X] = *it;
return true;
}
return false;
}
int main()
{
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
int N, M, E;
scanf ("%d %d %d", &N, &M, &E);
while (E --)
{
int u, v;
scanf ("%d %d", &u, &v);
G[u].PB (v);
}
bool ok = true;
while (ok)
{
ok = false;
memset (Viz, false, sizeof (Viz));
for (int i = 1; i <= N; ++ i)
if (! DR[i] && cupleaza (i)) ++ cuplaj, ok = true;
}
printf ("%d\n", cuplaj);
for (int i = 1; i <= N; ++ i) if (DR[i]) printf ("%d %d\n", i, DR[i]);
return 0;
}