Pagini recente » Cod sursa (job #1585640) | Cod sursa (job #738043) | Cod sursa (job #1717064) | Cod sursa (job #945948) | Cod sursa (job #1006025)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
const int NMAX = 10003;
vector <int> G[NMAX];
bitset <NMAX> paired;
int left[NMAX], right[NMAX];
bool pairup (const int &node) {
if (paired[node])
return 0;
vector <int> :: iterator i;
paired[node] = 1;
for (i = G[node].begin (); i != G[node].end (); ++i)
if (!right[*i]) {
left[node] = *i;
right[*i] = node;
return 1;
}
for (i = G[node].begin (); i != G[node].end (); ++i)
if (pairup (right[*i])) {
left[node] = *i;
right[*i] = node;
return 1;
}
return 0;
}
int main () {
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
int N, M, E, i, a, b, r = 0;
bool change = 1;
scanf ("%d%d%d", &N, &M, &E);
for (i = 1; i <= E; ++i)
scanf ("%d%d", &a, &b),
G[a].push_back (b);
while (change) {
change = 0;
paired.reset ();
for (i = 1; i <= N; ++i)
if (!left[i])
if (pairup (i))
change = 1;
}
for (i = 1; i <= N; ++i)
if (left[i])
++r;
printf ("%d", r);
for (i = 1; i <= N; ++i)
if (left[i])
printf ("\n%d %d", i, left[i]);
}