Cod sursa(job #373347)

Utilizator titusuTitus C titusu Data 13 decembrie 2009 16:26:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
using namespace std;
#include <cstdio>
#define MAX 10005
struct nod{
	int info;
	nod * next;
};

nod * G[MAX];
int n,m, //nr de varfuri per multime
	L[MAX], //L[k]=x   <=> muchia (k,x) face parte din cuplaj
	R[MAX], //R[k] = x <=> muchia (x,k) face parte din cuplaj
	u[MAX], //vector caracteristic, pentru cuplarea curenta
	cuplaj; //valoarea cuplajului (nr de muchii)

void read(){
	freopen("cuplaj.in","r",stdin);
	int i,j,nrm;
	nod *p;
	scanf("%d%d%d", &n,&m,&nrm);
	for(i=1 ; i<=n;i++)
		G[i]=NULL;
	for( ; nrm ; --nrm){
		scanf("%d%d",&i,&j);
		p=new nod;
		p->info=j;
		p->next=G[i];
		G[i]=p;
	}
}
void write(){
	freopen("cuplaj.out","w",stdout);
	printf("%d\n",cuplaj);
	for(int i=1;i<=n;i++)
		if(L[i])
			printf("%d %d\n",i,L[i]);
}

int pereche(int x){
	//cuplez x din stanga cu ceva din dreapta
	if(u[x])
		return 0;
	u[x]=1;
	for(nod *p=G[x] ; p ; p=p->next){
		int i=p->info;
		if(R[i]==0 || pereche(R[i])){
			L[x]=i, R[i]=x;
			return 1;
		}
	}
	return 0;
}

void cupleaza(){
	int gata=0;
	cuplaj=0;
	while(!gata){
		gata=1;
		for(int i=1;i<=n;i++)
			u[i]=0;
		for(int i=1;i<=n;i++)
			if(L[i]==0)
				if(pereche(i))
					cuplaj++, gata=0;
	}
}

int main(){
	read();
	cupleaza();
	write();
}