Cod sursa(job #46270)

Utilizator sealTudose Vlad seal Data 2 aprilie 2007 14:20:08
Problema Cc Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
#define Nm 101
#define Inf Nm*Nm*10000
int D[Nm][Nm],n;
int F[2*Nm][2*Nm],Dm[2*Nm],Pre[2*Nm],cost;

void read()
{
    int i,j;

    freopen("cc.in","r",stdin);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	    scanf("%d",&D[i][j]);
}

int Bellman_Ford()
{
    int i,j,k;

    Dm[0]=0;
    for(i=1;i<=2*n+1;i++)
	Dm[i]=Inf;

    for(k=0;k<=2*n;k++)
    {
	for(i=1;i<=n;i++)
	    for(j=1;j<=n;j++)
	    {
		if(!F[i][n+j] && Dm[i]+D[i][j]<Dm[n+j])
		{
		    Dm[n+j]=Dm[i]+D[i][j];
		    Pre[n+j]=i;
		}
		if(F[n+j][i]<0 && Dm[n+j]-D[i][j]<Dm[i])
		{
		    Dm[i]=Dm[n+j]-D[i][j];
		    Pre[i]=n+j;
		}
	    }

	for(i=1;i<=n;i++)
	    if(!F[0][i] && Dm[0]<Dm[i])
	    {
		Dm[i]=Dm[0];
		Pre[i]=0;
	    }

	for(i=n+1;i<=2*n;i++)
	    if(!F[i][2*n+1] && Dm[i]<Dm[2*n+1])
	    {
		Dm[2*n+1]=Dm[i];
		Pre[2*n+1]=i;
	    }
    }

    return Dm[2*n+1];
}

void solve()
{
    int i,j;

    for(j=0;j<n;j++)
    {
	cost+=Bellman_Ford();
	i=2*n+1;
	while(i)
	{
	    F[Pre[i]][i]++;
	    F[i][Pre[i]]--;
	    i=Pre[i];
	}
    }
}

void write()
{
    freopen("cc.out","w",stdout);
    printf("%d\n",cost);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}