Cod sursa(job #782726)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 29 august 2012 14:42:32
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<stdio.h>
#define inf 2000000000
#define dim 10010

FILE*f=fopen("cuplaj.in","r");
FILE*g=fopen("cuplaj.out","w");

int i,n,m,e,C[dim][dim],F[dim][dim],T[dim],a,b,viz[dim],z,s,j,x,min,R[2*dim][3];

struct nod{
	int nr;
	nod* adr;
}*p,*c,*L[dim];

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


int bfs(){
	for(i=0;i<=n+m+1;i++)
		viz[i]=0;
	int D[dim];D[1]=0;viz[0]=1;
	int p=1,u=1,ok=0;
	while(p<=u){
		x=D[p];
		if(x==(n+m+1)){
			p++;
			continue;
		}
		c=L[x];
		
		while(c){
			if(!viz[c->nr]&&C[x][c->nr]>F[x][c->nr]){
				D[++u]=c->nr;
				viz[c->nr]=1;
				T[c->nr]=x;
				if(c->nr==n+m+1)
					ok=1;
			}
			
			c=c->adr;
		}
		
		p++;
	}
	return ok;
}


int main(){
	read();
	
	while(bfs()){
		c=L[n+m+1];
		while(c){
			if(viz[c->nr]&&C[c->nr][n+m+1]>F[c->nr][n+m+1]){
				T[n+m+1]=c->nr;
				z=n+m+1;min=inf;
				while(T[z]){
					if(C[T[z]][z]-F[T[z]][z]<min)
						min=C[T[z]][z]-F[T[z]][z];
					z=T[z];
				}
				if(C[T[z]][z]-F[T[z]][z]<min)
						min=C[T[z]][z]-F[T[z]][z];
				if(min==inf)
					continue;
				z=n+m+1;
				while(T[z]){
					F[T[z]][z]+=min;
					F[z][T[z]]-=min;
					z=T[z];
				}
				F[T[z]][z]+=min;
				F[z][T[z]]-=min;
			}
			c=c->adr;
		}
	}
	
	for(i=1;i<=n;i++){
		c=L[i];
		while(c){
			if(c->nr==0){
				c=c->adr;
				continue;
			}
			if(F[i][c->nr]==1){
				s++;
				R[s][0]=i;
				R[s][1]=c->nr-n;
			}
			c=c->adr;
		}
	}
	fprintf(g,"%d\n",s);
	for(i=1;i<=s;i++){
		for(j=0;j<=1;j++)
			fprintf(g,"%d ",R[i][j]);
		fprintf(g,"\n");
	}
	return 0;
}