Cod sursa(job #304064)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 10 aprilie 2009 20:16:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <algorithm>
#include <vector>
#define FIN "cuplaj.in"
#define FOUT "cuplaj.out"
#define MAX 10010
#define PB push_back
using namespace std;
char sel[MAX];
int stanga[MAX],dreapta[MAX];
int N,M,E;
vector<int> vecini[MAX];
int STEP=0;


void iofile(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);

	scanf("%d%d%d",&N,&M,&E);

	int x,y;
	for (int i=1;i<=E;++i){

		scanf("%d%d",&x,&y);
		vecini[x].PB(y);
	}

	fclose(stdin);
}



int pairUp(int nod){

	if (sel[nod]>=STEP){return 0;}
	sel[nod]=STEP;
	for (int i=1;i<=vecini[nod].size();++i){
		int vecin=vecini[nod][i-1];
		if (!stanga[vecin]){

			stanga[vecin]=nod;
			dreapta[nod]=vecin;
			return 1;
		}
	}

	for (int i=1;i<=vecini[nod].size();++i){
		int vecin=vecini[nod][i-1];
		if (pairUp(stanga[vecin])){

			stanga[vecin]=nod;
			dreapta[nod]=vecin;
			return 1;
		}
	}
	return 0;
}


void cuplaj(void){
	
	STEP=0;
	int ok=1,i;
	for (;ok;){ 
		++STEP;
		for (i=1,ok=0;i<=N;++i){
			if (!dreapta[i]){
				ok|=pairUp(i);
			}
		}
	}

	int cuplajmax=0;
	for (int i=1;i<=N;++i) if (dreapta[i])++cuplajmax;
	printf("%d\n",cuplajmax);
	for (int i=1;i<=N;++i) if (dreapta[i]) printf("%d %d\n",i,dreapta[i]);
	
	fclose(stdout);
}

int main(void){

	iofile();
	cuplaj();
	return 0;
}