Cod sursa(job #721387)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 23 martie 2012 17:50:10
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>
int n1,n2,**t,m,inf=99999999,NR,sol[2][10000];
void read(){
	FILE *f=fopen("cuplaj.in","r");
	fscanf(f,"%d %d %d\n",&n1,&n2,&m);
	int i,x,y,j;
	t=new int * [n1+5];
	for(i=0;i<=n1+2;i++){
		t[i]=new int [n2+5];
		for(j=0;j<=n2+2;j++)
			t[i][j]=0;
	}
	for(i=1;i<=m;i++){
		fscanf(f,"%d %d\n",&x,&y);
		t[x][y]=1;
		t[x][n2+1]++;
	}
	fclose(f);
}
int minim(){
	int i,min=inf;
	for(i=1;i<=n1;i++){
		if(t[i][n2+1]>0&&min>t[i][n2+1])
			min=t[i][n2+1];
	}
	if(min<inf&&min>0)
		return min;
	return 0;
}
int find(int min){
	for(int i=1;i<=n1;i++)
		if(min==t[i][n2+1])
			return i;
	return 0;
}
void del(int k){
	for(int i=1;i<=n1;i++){
		if(t[i][k]>0){
			t[i][k]=0;
			t[i][n2+1]--;
		}
	}
}
void write(int a,int nr){
	for(int i=1;i<=n2;i++){
		if(t[a][i]==1){
			t[a][i]=0;
			del(i);
			NR++;
			sol[0][NR]=a;
			sol[1][NR]=i;
			nr--;
			if(nr==0){
				return;
			}
		}
	}
}
void afis(){
	int i,j;
	for(i=1;i<=n1;i++){
		for(j=1;j<=n2+1;j++)
			printf("%d ",t[i][j]);
		printf("\n");
	}
}
int main(){
	read();
//	afis();
	int min=minim(),k;
	while(min){
		k=find(min);
		write(k,min);
		t[k][n2+1]=0;
		min=minim();
	}
	freopen("cuplaj.out","w",stdout);
	printf("%d\n",NR);
	int i;
	for(i=1;i<=NR;i++)
		printf("%d %d\n",sol[0][i],sol[1][i]);
	fclose(stdout);
	return 0;
}