Pagini recente » Cod sursa (job #1682376) | Cod sursa (job #1899531) | Cod sursa (job #994048) | Cod sursa (job #1186479) | Cod sursa (job #2469664)
#include <bits/stdc++.h>
#define MAXN (int)(1e4 + 5)
using namespace std;
int N, M, edgeCount; //N - left size, M - right size
vector<int> G[MAXN];
int rightPair[MAXN], leftPair[MAXN], visited[MAXN];
int pairUp(int currNode) {
visited[currNode] = 1;
for (int rightNode : G[currNode])
if (!leftPair[rightNode]) {
rightPair[currNode] = rightNode;
leftPair[rightNode] = currNode;
return 1;
}
for (int rightNode : G[currNode])
if (!visited[leftPair[rightNode]] && pairUp(leftPair[rightNode])) {
rightPair[currNode] = rightNode;
leftPair[rightNode] = currNode;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d %d %d", &N, &M, &edgeCount);
int x, y;
for (int i = 1; i <= edgeCount; ++i) {
scanf("%d %d", &x, &y);
G[x].push_back(y);
}
for (int change = 1; change;) {
change = 0;
memset(visited, 0, sizeof(visited));
for (int i = 1; i <= N; ++i)
if (!rightPair[i]) change |= pairUp(i);
}
int cuplaj = 0;
for (int i = 1; i <= N; ++i)
if (rightPair[i]) cuplaj += (rightPair[i] > 0);
printf("%d\n", cuplaj);
for (int i = 1; i <= N; ++i)
if (rightPair[i]) printf("%d %d\n", i, rightPair[i]);
return 0;
}