Pagini recente » Cod sursa (job #2661478) | Cod sursa (job #310335) | Cod sursa (job #2536915) | Cod sursa (job #315676) | Cod sursa (job #430999)
Cod sursa(job #430999)
#include <cstdio>
using namespace std;
FILE *f=fopen("cc.in","r");
FILE *g=fopen("cc.out","w");
#define nmax 256
#define inf 1<<18
int Cs[nmax][nmax],n;
int Fx[nmax][nmax],C[nmax][nmax];
int fl[nmax],pre[nmax],dist[nmax];
int Q[4*nmax],k;
#define Q (Q-1)
int sol;
bool drum,vizq[nmax];
inline int min(int a,int b)
{
if(a<b) return a;
return b;
}
void read()
{
int i,j;
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
fscanf(f,"%d",&Cs[i][n+j]);
Cs[n+j][i]=-Cs[i][n+j];
C[i][n+j]=1;
C[0][i]=1;
C[n+j][2*n+1]=1;
Cs[0][i]=Cs[n+j][2*n+1]=0;
}
n*=2;
++n;
}
int BF()
{
int i,j,x;
for(i=1;i<=n;i++) dist[i]=inf;
k=0;
Q[++k]=0;
fl[0]=5;
pre[0]=-1;
vizq[0]=true;
for(i=1;i<=k;i++)
{
x=Q[i];
for(j=0;j<=n;j++)
{
if((C[x][j]-Fx[x][j]>0)&&(dist[j]>dist[x]+Cs[x][j]))
{
fl[j]=min(fl[x],C[x][j]-Fx[x][j]);
dist[j]=dist[x]+Cs[x][j];
pre[j]=x;
if(!vizq[j])
{
vizq[j]=true;
Q[++k]=j;
}
}
}
vizq[x]=false;
}
if(dist[n]!=inf)
{
drum=true;
for(i=n;pre[i]!=-1;i=pre[i])
{
Fx[pre[i]][i]+=fl[n];
Fx[i][pre[i]]-=fl[n];
}
return dist[n];
}
drum=false;
return 0;
}
int flux()
{
do
{
sol+=BF();
}while(drum);
return sol;
}
int main()
{
read();
fprintf(g,"%d",flux());
return 0;
}