Cod sursa(job #1500232)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 11 octombrie 2015 17:16:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX 10005
using namespace std;

int n, m, e, i, x, y, pair1[MAX], pair2[MAX], nrcupl;
bool viz[MAX], stop;
vector<int> l[MAX];

int match(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);
	}

	stop = 1;
	while(stop){
		memset(viz, 0, n + 1);
		stop = 0;
		for(int i = 1; i <= n; i++)
			if(!pair1[i])
				stop |= match(i);
	}

	for(i = 1; i <= n; i++)
		if(pair1[i])
			nrcupl++;
	printf("%d\n", nrcupl);
	for(i = 1; i <= n; i++)
		if(pair1[i])
			printf("%d %d\n", i, pair1[i]);
	return 0;
}

int match(int n){
	if(viz[n])
		return 0;
	viz[n] = 1;
	for(int i = 0; i < l[n].size(); i++)
		if(!pair2[l[n][i]]){
			pair1[n] = l[n][i];
			pair2[l[n][i]] = n;
			return 1;
		}
	for(int i = 0; i < l[n].size(); i++)
		if(match(pair2[l[n][i]])){
			pair1[n] = l[n][i];
			pair2[l[n][i]] = n;
			return 1;
		}
	return 0;
}