Pagini recente » Cod sursa (job #422252) | Cod sursa (job #1635006) | Cod sursa (job #3201063) | Cod sursa (job #2211224) | Cod sursa (job #1467976)
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <list>
#include <queue>
#include <cstring>
#include <set>
using namespace std;
#ifdef INFOARENA
#define ProblemName "cuplaj"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
#define NMAX 10010
vector< list<int> > G(NMAX);
vector<int> leftPair(NMAX, -1);
vector<int> rightPair(NMAX, -1);
vector<char> visited(NMAX);
char pairUp(int nod) {
if (visited[nod])
return 0;
visited[nod] = 1;
for (auto i : G[nod])
if (rightPair[i] == -1) {
rightPair[i] = nod;
leftPair[nod] = i;
return 1;
}
for (auto i : G[nod])
if (pairUp(rightPair[i])) {
rightPair[i] = nod;
leftPair[nod] = i;
return 1;
}
return 0;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
int N, M, E;
scanf("%d%d%d", &N, &M, &E);
while (E--) {
int n1, n2;
scanf("%d%d", &n1, &n2);
G[n1 - 1].push_back(n2 - 1);
}
char found = 1;
while (found) {
found = 0;
memset(&visited[0], 0, sizeof(visited[0]) * visited.size());
for (int i = 0; i < N; i++)
if (leftPair[i] == -1)
found |= pairUp(i);
}
int flow = 0;
for (int i = 0; i < N; i++)
if (leftPair[i] != -1)
flow++;
printf("%d\n", flow);
for (int i = 0; i < N; i++)
if (leftPair[i] != -1)
printf("%d %d\n", i + 1, leftPair[i] + 1);
return 0;
}