Pagini recente » Cod sursa (job #362387) | Cod sursa (job #2642382) | Cod sursa (job #1684799) | Cod sursa (job #468068) | Cod sursa (job #607078)
Cod sursa(job #607078)
#include <stdio.h>
#include <string.h>
#include <queue>
#include <bitset>
#include <algorithm>
#include <assert.h>
#define NMax 110
#define INF 0x3f3f3f3f
using namespace std;
const char IN[]="cc.in",OUT[]="cc.out";
int N;
bool done=false;
int Cos[2*NMax][2*NMax] , C[2*NMax][2*NMax] , F[2*NMax][2*NMax] , T[2*NMax] , P[2*NMax];
int BellmanFord()
{
int i,x;
bitset<NMax> v;
queue<int> qu;
qu.push(0);
memset(T,0x3f,sizeof(T));
T[0]=0;v[0]=true;
while (!qu.empty())
{
x=qu.front();qu.pop();
for (i=0;i<=2*N+1;++i) if (C[x][i]>F[x][i] && Cos[x][i]+T[x]<T[i])
{
T[i]=Cos[x][i]+T[x];
P[i]=x;
if (!v[i]) v[i]=true,qu.push(i);
}
v[x]=false;
}
return T[2*N+1]!=INF;
}
int flux()
{
int ret=0,x,fmin;
while (BellmanFord())
{
fmin=INF;
for (x=2*N+1;x;x=P[x])
fmin=min(fmin,C[P[x]][x]-F[P[x]][x]);
for (x=2*N+1;x;x=P[x])
F[P[x]][x]+=fmin,
F[x][P[x]]-=fmin;
ret+=T[2*N+1]*fmin;
}
return ret;
}
int main()
{
int i,j;
freopen(IN,"r",stdin);
scanf("%d",&N);
for (i=1;i<=N;++i)
for (j=1;j<=N;++j)
scanf("%d",&Cos[i][N+j]),Cos[N+j][i]=-Cos[i][N+j],
C[i][N+j]=1;
fclose(stdin);
for (i=1;i<=N;++i) C[0][i]=1;
for (i=N+1;i<=2*N;++i) C[i][2*N+1]=1;
freopen(OUT,"w",stdout);
printf("%d\n",flux());
fclose(stdout);
return 0;
}