Pagini recente » Cod sursa (job #2176569) | Cod sursa (job #574734) | Cod sursa (job #1334946) | Cod sursa (job #1982443) | Cod sursa (job #1247843)
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int NMAX = 1e4;
vector <int> graph[NMAX + 5];
int n, m, matched[NMAX + 5], left[NMAX + 5], right[NMAX + 5];
bool pairUp (int node) {
if(matched[node])
return 0;
vector <int>::iterator it;
matched[node] = 1;
for(it = graph[node].begin(); it != graph[node].end(); ++ it)
if(!left[*it] || pairUp(left[*it])) {
right[node] = *it;
left[*it] = node;
return 1;
}
return 0;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int i, x, y, e, flag, card;
scanf("%d%d%d", &n, &m, &e);
for(i = 1; i <= e; ++ i) {
scanf("%d%d", &x, &y);
graph[x].push_back(y);
}
flag = 1;
while(flag) {
flag = 0;
memset(matched, 0, sizeof(matched));
for(i = 1; i <= n; ++ i)
if(!right[i]) {
if(pairUp(i))
flag = 1;
}
}
card = 0;
for(i = 1; i <= n; ++ i)
if(right[i])
++ card;
printf("%d\n", card);
for(i = 1; i <= n; ++ i)
if(right[i])
printf("%d %d\n", i, right[i]);
return 0;
}