Pagini recente » Cod sursa (job #2328624) | Cod sursa (job #729019) | Cod sursa (job #2692937) | Cod sursa (job #483582) | Cod sursa (job #429255)
Cod sursa(job #429255)
#include <cstdio>
#include<vector>
using namespace std;
#define NMAX 128
#define MMAX 256
#define oo 1000004
bool gasit,viz[MMAX];
short F[MMAX][MMAX],Cap[MMAX][MMAX];
int Cost[MMAX][MMAX],Q[MMAX];
vector <int> A[MMAX];
int D[MMAX],s,d,n,from[MMAX];
void citire()
{
freopen("cc.in","r",stdin);
scanf("%d",&n);
s=0; d=n+n+1;
int i,j;
for (i=1;i<=n;++i)
{
for (j=1;j<=n;++j)
{
scanf("%d",&Cost[i][n+j]);
Cost[n+j][i]=-Cost[i][n+j];
Cap[i][n+j]=1;
A[i].push_back(n+j);
A[n+j].push_back(i);
}
Cap[0][i]=1; Cap[i+n][d]=1;
A[0].push_back(i); A[i].push_back(0);
A[i+n].push_back(d); A[d].push_back(i+n);
}
}
int Flux()
{
memset(viz,0,sizeof(viz));
int st,dr,i,x;
for (i=1;i<=d;++i) {D[i]=oo; from[i]=-1;}
D[s]=0; viz[s]=1; st=dr=0; Q[0]=s;
while (st<=dr)
{
x=Q[st++];
for (i=0;i<A[x].size();++i)
if (Cap[x][A[x][i]]-F[x][A[x][i]]>0 && D[A[x][i]]>D[x]+Cost[x][A[x][i]])
{
D[A[x][i]]=D[x]+Cost[x][A[x][i]];
from[A[x][i]]=x;
if (!viz[A[x][i]])
{
viz[A[x][i]]=1;
Q[++dr]=A[x][i];
}
}
viz[x]=0;
}
if (from[d]==-1) return 0;
gasit=1;
int flux=oo;
for (i=d; i!=s; i=from[i]) flux=min(flux,Cap[from[i]][i]-F[from[i]][i]);
for (i=d; i!=s; i=from[i])
{F[from[i]][i]+=flux; F[i][from[i]]-=flux;}
return flux*D[d];
}
int main()
{
citire();
memset(F,0,sizeof(F));
gasit=1; int S=0;
while (gasit)
{
gasit=0;
S+=Flux();
}
freopen("cc.out","w",stdout);
printf("%d\n",S);
return 0;
}