Pagini recente » Cod sursa (job #919458) | Cod sursa (job #1458195)
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX 100005
using namespace std;
vector<int> l[MAX];
int n, m, e, i, pair1[MAX], pair2[MAX], viz[MAX], x, y;
int perechi(int n);
int main(){
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d%d%d", &n, &m, &e);
for(i = 0; i < e; i++){
scanf("%d%d", &x, &y);
l[x].push_back(y);
}
int change;
for(change = 1; change;){
change = 0;
memset(viz, 0, sizeof(viz));
for(i = 1; i <= n; i++)
if(!pair1[i])
change |= perechi(i);
}
int cupl = 0;
for(i = 1; i <= n; i++)
if(pair1[i])
cupl++;
printf("%d\n", cupl);
for(i = 1; i <= n; i++)
if(pair1[i])
printf("%d %d\n", i, pair1[i]);
return 0;
}
int perechi(int n){
if(viz[n])
return 0;
viz[n] = 1;
vector<int>::iterator it;
for(it = l[n].begin(); it < l[n].end(); it++)
if(!pair2[*it]){
pair1[n] = *it;
pair2[*it] = n;
return 1;
}
for(it = l[n].begin(); it < l[n].end(); it++)
if(perechi(pair2[*it])){
pair1[n] = *it;
pair2[*it] = n;
return 1;
}
return 0;
}