Cod sursa(job #46674)

Utilizator sealTudose Vlad seal Data 2 aprilie 2007 20:50:44
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#define Nm 101
#define Inf Nm*10000
int D[Nm][Nm],n;
int F[2*Nm][2*Nm],Q[4*Nm*Nm],Dm[2*Nm],Pre[2*Nm],Uz[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]);
}

void insert(int x, int &r)
{
    if(!Uz[x])
    {
	Q[++r]=x;
	Uz[x]=1;
    }
}

int Bellman_Ford()
{
    int l=0,r=-1,x,i;

    for(i=1;i<=2*n+1;i++)
    {
	Dm[i]=Inf;
	Uz[i]=0;
    }
    for(i=1;i<=n;i++)
	if(!F[0][i])
	{
	    Dm[i]=0;
	    Pre[i]=0;
	    insert(i,r);
	}

    while(l<=r)
    {
	x=Q[l++];
	Uz[x]=0;
	if(x>n)
	{
	    for(i=1;i<=n;i++)
		if(F[x][i]<0 && Dm[x]-D[i][x-n]<Dm[i])
		{
		    Dm[i]=Dm[x]-D[i][x-n];
		    Pre[i]=x;
		    insert(i,r);
		}
	    if(Dm[x]<Dm[2*n+1])
	    {
		Dm[2*n+1]=Dm[x];
		Pre[2*n+1]=x;
	    }
	}
	else
	    for(i=n+1;i<=2*n;i++)
		if(!F[x][i] && Dm[x]+D[x][i-n]<Dm[i])
		{
		    Dm[i]=Dm[x]+D[x][i-n];
		    Pre[i]=x;
		    insert(i,r);
		}
    }

    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;
}