Pagini recente » Cod sursa (job #1706668) | Cod sursa (job #1480356) | Cod sursa (job #2214819) | Atasamentele paginii Clasament becreative23 | Cod sursa (job #1656164)
#include <cstdio>
#include <bitset>
#include <vector>
#include <cstdlib>
#include <queue>
using namespace std;
const int NMAX = 10002;
vector <int> bgraph[NMAX];
bitset <NMAX> check;
int left[NMAX], right[NMAX], N, M;
bool couple (const int node) {
check[node] = true;
for (auto i : bgraph[node])
if (!right[i]) {
right[i] = node;
left[node] = i;
return true;
}
for (auto i : bgraph[node]) {
if (!check[right[i]] && couple(right[i])) {
right[i] = node;
left[node] = i;
return true;
}
}
return false;
}
int main () {
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
int E;
scanf ("%d%d%d", &N, &M, &E);
while (E--) {
int left, right;
scanf ("%d%d", &left, &right);
bgraph[left].push_back(right);
}
bool stop;
do {
stop = true;
check.reset();
for (int i = 1; i <= N; ++i) {
if (!left[i] && couple(i)) {
stop = false;
}
}
} while (!stop);
int maxCouple = 0;
for (int i = 1; i <= N; ++i) {
if (left[i])
++maxCouple;
}
printf ("%d\n", maxCouple);
for (int i = 1; i <= N; ++i)
if (left[i])
printf ("%d %d\n", i, left[i]);
}