Cod sursa(job #1458195)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 7 iulie 2015 08:55:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#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;
}