Cod sursa(job #279870)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 13 martie 2009 02:08:38
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<fstream.h>
#define INF 1000000
#define N 1000
#define maxim(x,y) ((x)>(y)?(x):(y));
#define minim(x,y) ((x)<(y)?(x):(y));

//using namespace std;

int c[N][N], flux, d[N], f[N][N], t[N], b[N], nr, n, m, i, j, ok, length,k,x1,y1;
char aux[Nmax];

void edmondsKarp();
int bf();



int main()
{
	ifstream f("cuplaj.in");
	ofstream g("cuplaj.out");

	f>>n>>m>>k;

	for(i = 1;i <= k; i++)
	{
		f>>x1>>y1;
		c[x1][n+y1] = 1;
		c[n+y1][x1] = 1;
	}

	
	for(i=1;i<=n;i++)
		c[0][i]   = 1;
	for(i=n+1;i<=m+n;i++)
		c[i][m+n+1] = 1;

	edmondsKarp();
	k = minim(n,m);
	g<<k<<"\n";
	k = maxim(n,m);
	for(i=1;i<=k;i++)
	      if(b[i] != 0)
		    g<<i<<" "<<b[i]<<"\n";

	return 0;
}


void edmondsKarp()
{
	int min, drum[N],k;

	do{

		for(i=0; i<= m+n+1; i++)
			d[i] = drum[i] = 0;

		min = bf();
		if(min > 0)
		{
			flux+=min;
			i = m+n+1;
			k = 0;
			drum[++k] = i;

			while(i>0)
			{
				j = t[i];
				f[j][i] += min;
				f[i][j] -= min;
				drum[++k] = j;
				i = j;
			}

			for(i=k;i>1;i--)
				if(drum[i]>=1 && drum[i]<=n && drum[i-1] >= n+1 && drum[i-1] <= n+m)
					b[drum[i]] = drum[i-1] - n;
		}
	}
	while(min !=0);
}

int bf()
{
	int coada[N],prim=1, ultim=1, nod_cur;

	memset(coada, 0, sizeof(coada));

	memset(t, -1, sizeof(t));

	d[0] = INF;

	while(prim <= ultim)
	{
		nod_cur = coada[prim];

		for(i=0;i<=m+n+1;i++)
			if(t[i]== -1 && c[nod_cur][i] - f[nod_cur][i] > 0)
			{
				coada[++ultim] = i;
				t[i] = nod_cur;
				if(d[nod_cur] < c[nod_cur][i] - f[nod_cur][i])
					d[i] = d[nod_cur];
				else
					d[i] = c[nod_cur][i] - f[nod_cur][i];
				if(i == m+n+1)
					return d[m+n+1];
			}
		prim++;
	}
	return 0;
}