Cod sursa(job #46674)
#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;
}