Cod sursa(job #782744)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 29 august 2012 16:01:55
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
#define dim 10010
FILE*f=fopen("cuplaj.in","r");
FILE*g=fopen("cuplaj.out","w");

struct nod{
	int nr;
	nod *adr;
}*c,*p,*L[dim];
int i,n,m,e,a,b,s,C[2*dim];

void read(){
	fscanf(f,"%d%d%d",&n,&m,&e);
	for(i=1;i<=e;i++){
		fscanf(f,"%d%d",&a,&b);
		p=new nod;
		p->nr=n+b;
		p->adr=L[a];
		L[a]=p;
		p=new nod;
		p->nr=a;
		p->adr=L[n+b];
		L[n+b]=p;
	}
}

void decupleaza(int x){
	if(C[x]==0)
		return;
	nod *q=L[x];
	while(q){
		if(C[x]==q->nr){
			q=q->adr;
			continue;
		}
		decupleaza(q->nr);
		if(C[q->nr]==0){
			C[C[x]]=0;
			C[x]=q->nr;
			C[q->nr]=x;
			return;
		}
		q=q->adr;
	}
}


int main(){
	read();
	for(i=1;i<=n;i++){
		c=L[i];
		while(c){
			if(C[c->nr]==0){
				C[i]=c->nr;
				C[c->nr]=i;
				break;
			}
			c=c->adr;
		}
	}
	
	for(i=1;i<=n;i++){
		if(C[i]==0){
			c=L[i];
			while(c){
				decupleaza(C[c->nr]);
				if(C[c->nr]==0){
					C[i]=c->nr;
					C[c->nr]=i;
					break;
				}
				c=c->adr;
			}
		}
	}
	
	for(i=1;i<=n;i++){
		if(C[i])
			s++;
	}
	
	fprintf(g,"%d\n",s);
	for(i=1;i<=n;i++)
		if(C[i])
			fprintf(g,"%d %d\n",i,C[i]-n);
	
	return 0;
}