Pagini recente » Cod sursa (job #1349) | Cod sursa (job #1763955) | Cod sursa (job #1332) | Cod sursa (job #2489208) | Cod sursa (job #445329)
Cod sursa(job #445329)
#include <cassert>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAX_N = 10000;
int n, m, edges;
vector<int> graph[MAX_N];
int cuplaj[MAX_N];
char vis[MAX_N];
int cupleaza(int leftNode) {
if (vis[leftNode]) return 0;
vis[leftNode] = 1;
for (int i = 0; i < (int)graph[leftNode].size(); ++i) {
int rightNode = graph[leftNode][i];
if (!cuplaj[rightNode]) {
cuplaj[rightNode] = leftNode;
return 1;
} else if (cupleaza(cuplaj[rightNode])) {
cuplaj[rightNode] = leftNode;
return 1;
}
}
return 0;
}
void write() {
int cnt = 0;
for (int i = 1; i <= m; ++i)
cnt += cuplaj[i] != 0;
printf("%d\n", cnt);
for (int i = 1; i <= m; ++i)
if (cuplaj[i] > 0)
printf("%d %d\n", cuplaj[i], i);
}
int main() {
assert(freopen("cuplaj.in", "r", stdin) != NULL);
assert(freopen("cuplaj.out", "w", stdout) != NULL);
assert(scanf("%d %d %d", &n, &m, &edges) == 3);
for (int i = 0; i < edges; ++i) {
int a, b;
assert(scanf("%d %d", &a, &b) == 2);
graph[a].push_back(b);
}
for (int i = 1; i <= n; ++i) {
memset(vis, 0, sizeof(vis));
cupleaza(i);
}
write();
}