Cod sursa(job #429255)

Utilizator otilia_sOtilia Stretcu otilia_s Data 29 martie 2010 23:28:34
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include<vector>
using namespace std;
#define NMAX 128
#define MMAX 256
#define oo 1000004
bool gasit,viz[MMAX];
short F[MMAX][MMAX],Cap[MMAX][MMAX];
int Cost[MMAX][MMAX],Q[MMAX];
vector <int> A[MMAX];
int D[MMAX],s,d,n,from[MMAX];

void citire()
{
	freopen("cc.in","r",stdin);
	scanf("%d",&n);
	s=0; d=n+n+1;
	int i,j;
	for (i=1;i<=n;++i)
	{
	 for (j=1;j<=n;++j)
	 {
		scanf("%d",&Cost[i][n+j]);		
		Cost[n+j][i]=-Cost[i][n+j];
		Cap[i][n+j]=1;
		A[i].push_back(n+j);
		A[n+j].push_back(i);
	 }	 
	 Cap[0][i]=1; Cap[i+n][d]=1;
	 A[0].push_back(i); A[i].push_back(0);
	 A[i+n].push_back(d); A[d].push_back(i+n);
	}
}

int Flux()
{
	memset(viz,0,sizeof(viz));
	int st,dr,i,x;	
	for (i=1;i<=d;++i) {D[i]=oo; from[i]=-1;}	
	D[s]=0; viz[s]=1; st=dr=0; Q[0]=s;
	while (st<=dr)
	{
		x=Q[st++];
		for (i=0;i<A[x].size();++i)
		 if (Cap[x][A[x][i]]-F[x][A[x][i]]>0 && D[A[x][i]]>D[x]+Cost[x][A[x][i]])
		 {
			D[A[x][i]]=D[x]+Cost[x][A[x][i]];
			from[A[x][i]]=x;
			if (!viz[A[x][i]])
				{
				 viz[A[x][i]]=1;
				 Q[++dr]=A[x][i];
				}
		 }
		viz[x]=0;
	}
	
	if (from[d]==-1) return 0;	
	gasit=1; 
	int flux=oo;
	for (i=d; i!=s; i=from[i]) flux=min(flux,Cap[from[i]][i]-F[from[i]][i]);
	for (i=d; i!=s; i=from[i]) 
		{F[from[i]][i]+=flux; F[i][from[i]]-=flux;}
	return flux*D[d];
}

int main()
{
	citire();
	memset(F,0,sizeof(F));
	gasit=1; int S=0;
	while (gasit)
	{
		gasit=0;
		S+=Flux();
	}
	
	freopen("cc.out","w",stdout);
	printf("%d\n",S);
	return 0;
}