Cod sursa(job #80922)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 30 august 2007 17:25:32
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
# include <stdio.h>
# include <stdlib.h>

const long int MAXN=205;

typedef struct NOD{long int inf; NOD *next;};

NOD *prim=NULL,*ultim=NULL;

long int n,sol,cost[MAXN+1][MAXN+1],tata[MAXN+1];
short cap[MAXN+1][MAXN+1];

const long int INF=0xfffffff;

void citire()
{
FILE *f=fopen("cc.in","r");
fscanf(f,"%ld",&n);
long int i,j,cc;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
	{
	fscanf(f,"%ld",&cc);
	cost[i][j+n]=cc;
	cost[j+n][i]=-cc;
	cap[i][j+n]=1;
	}
fclose(f);
for (i=1;i<=n;i++)
	{
	cap[0][i]=1;
	cap[i+n][2*n+1]=1;
	}
}

void scrie()
{
FILE *g=fopen("cc.out","w");
fprintf(g,"%ld\n",sol);
fcloseall();
}

void add(long int inf)
{
NOD *p=(NOD*) malloc (sizeof(NOD));
(*p).next=NULL;(*p).inf=inf;
if (prim)
	{
	(*ultim).next=p;
	ultim=p;
	}
else
	{
	prim=ultim=p;
	}
}

void gaseste_drum_minim()
{
long int i;
NOD *p;
long int r[MAXN+1];
for (i=1;i<=2*n+1;i++) r[i]=INF;
r[0]=0;
tata[2*n+1]=0;
add(0);
while (prim)
	{
	for (i=0;i<=2*n+1;i++)
		if (i!=(*prim).inf&&cap[(*prim).inf][i]&&r[i]>r[(*prim).inf]+cost[(*prim).inf][i])
			{
			tata[i]=(*prim).inf;
			r[i]=r[(*prim).inf]+cost[(*prim).inf][i];
			add(i);
			}
	p=prim;
	prim=(*prim).next;
	free(p);
	}
}

void satureaza()
{
long int i=2*n+1,p;
p=tata[i];
while (i)
	{
	sol+=cost[p][i];
	cap[p][i]--;
	cap[i][p]++;
	i=p;
	p=tata[i];
	}
}

void flux()
{
do
	{
	gaseste_drum_minim();
	if (tata[2*n+1]==0) break;
	satureaza();
	}
while (1);
}

int main()
{
citire();
flux();
scrie();
return 0;
}