Pagini recente » Cod sursa (job #455357) | Cod sursa (job #2611402) | Cod sursa (job #728118) | Cod sursa (job #666292) | Cod sursa (job #46270)
Cod sursa(job #46270)
#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;
}