Cod sursa(job #431011)

Utilizator mihaionlyMihai Jiplea mihaionly Data 31 martie 2010 15:54:37
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
using namespace std;
FILE *f=fopen("cc.in","r");
FILE *g=fopen("cc.out","w");
#define nmax 256
#define inf 10000001
int Cs[nmax][nmax],n;
int Fx[nmax][nmax],C[nmax][nmax];
int fl[nmax],pre[nmax],dist[nmax];
int Q[10*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]=inf;
 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;
 }