Cod sursa(job #300103)

Utilizator vladbBogolin Vlad vladb Data 7 aprilie 2009 11:26:59
Problema Cuplaj maxim in graf bipartit Scor 4
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream.h>

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int a[1001][1001],V[1001][1001],n;
int fmax=0,i,j,s,d,x[1001][3],Q[1001],p[1001],t[1001],gasit,v,p1,p2;

int main()
{   int e,f;
	fin>>n>>e>>f;
	while(fin>>e>>f)
	{	a[e][f]=1;
		a[0][e]=1;
		a[f][n+1]=1;
		V[e][0]++;
		if(V[0][p1]!=e)
		{	V[0][++p1]=e;
			V[0][0]++;
		}
		V[e][V[e][0]]=f;
		V[f][0]=1;
        V[f][1]=n+1;
	}
	do { gasit=0;
		 for(i=0;i<=n+1;i++)
		 {	Q[i]=0;
			p[i]=0;
			t[i]=0;
		 }
		 s=d=1;
		 p[0]=1;
		 Q[0]=1;
		 while(s<=d)
		 {	for(i=1;i<=V[Q[s]][0];i++)
			{ 	int j=V[Q[s]][i];
				if(p[j]==0&&a[Q[s]][j]>0)
				{	d++;
					Q[d]=j;
					p[j]=1;
					t[j]=Q[s];
					if(j==n+1) gasit=1;
				}
			}
			s++;
		 }
		 if(gasit)
		 {	int k=0;
			v=n+1;
			while(v!=0)
			{	k++;
				x[k][1]=t[v];
				x[k][2]=v;
				v=t[v];
			}
			int min=10000;
			for(i=1;i<=k;i++)
				if(min>a[x[i][1]][x[i][2]])
					min=a[x[i][1]][x[i][2]];
			fmax+=min;
			for(i=1;i<=k;i++)
			{	int b=x[i][1];
				int c=x[i][2];
				a[b][c]=a[b][c]-min;
				a[c][b]+=min;
			}
		 }
	}while(gasit);
	fout<<fmax<<"\n";
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i>j) if(a[i][j]==1) fout<<j<<" "<<i<<"\n";
	fin.close();
	fout.close();
	return 0;
}