Cod sursa(job #308567)

Utilizator undogSavu Victor Gabriel undog Data 27 aprilie 2009 20:14:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>
#include <cstring>

struct node{
	node* next;
	int val;
};

int n,m;
int r[10000],l[10000];
char u[10000];
node* v[10000];

int link(int x){
	if(u[x])
		return 0;
	u[x]=1;
	node* tmp;
	
	for(tmp=v[x];tmp;tmp=tmp->next)
		if(!r[tmp->val]||link(r[tmp->val])){
			l[x]=tmp->val;
			r[tmp->val]=x;
			return 1;
		}
	return 0;
}


int main(){
	freopen("cuplaj.in","rt",stdin);
	freopen("cuplaj.out","wt",stdout);
	
	int a,b,e;
	node* tmp;
	
	scanf("%d%d%d",&m,&n,&e);
	
	for(;e--;){
		scanf("%d%d",&a,&b);
		
		tmp=new node;
		tmp->val=b;
		tmp->next=v[a];
		v[a]=tmp;
	}
	
	a=0;
	
	while(!a){
		a=1;
		memset(u,0,sizeof(u));
		for(b=1;b<=m;b++)
			if(!l[b])
				if(link(b))
					a=0;
	}
	for(a=1,b=0;a<=m;a++)
		if(l[a])
			b++;
	printf("%d\n",b);
	for(a=1;a<=m;a++)
		if(l[a])
			printf("%d %d\n",a,l[a]);
	
	return 0;
}