Cod sursa(job #273422)

Utilizator zbarniZajzon Barna zbarni Data 8 martie 2009 15:48:32
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<fstream.h>
#define nx 220
#define inf 2000000
int cost[nx][nx],d[nx],tat[nx],cap[nx][nx];
int n,m,drum,s,S,D,flux[nx][nx];

int bellmanford()
 {
  int i,j,k,ok=0;
  for (i=0;i<=D;++i)
   d[i]=inf,tat[i]=-1;
  d[S]=0;
  for (k=0;k<=D && !ok;++k)
   {
    ok=1;
    for (i=0;i<=D;++i)
     for (j=0;j<=D;++j)
      if (cap[i][j]>flux[i][j] && d[j]>d[i]+cost[i][j])
	{
	 d[j]=d[i]+cost[i][j];
	 tat[j]=i;
	 ok=0;
	}
   }
  if (tat[D]!=-1)
    return 1;
  return 0;
 }

int Flux()
 {
  int rez=0,i,min=10000;
  while (bellmanford())
   {
    s=0;min=10000;
    for (i=D;i!=S;i=tat[i])
     {
      s+=cost[tat[i]][i];
      if (cap[tat[i]][i]-flux[tat[i]][i]<min)
	min=cap[tat[i]][i]-flux[tat[i]][i];
     }
    for (i=D;i!=S;i=tat[i])
     {
      flux[tat[i]][i]+=min;
      flux[i][tat[i]]-=min;
     }
    rez+=s*min;
   }
  return rez;
 }

int main()
 {
  ifstream be ("cc.in");
  ofstream ki ("cc.out");
  int i,j;
  be>>n;
  for (i=1;i<=n;++i)
   for (j=1;j<=n;++j)
     {
      be>>cost[i][n+j];
      cost[n+j][i]=-cost[i][n+j];
      cap[i][n+j]=1;
     }
  be.close();
  S=0,D=2*n+1;
  for (i=1;i<=n;++i)
   {
    cost[n+i][D]=0;
    cap[n+i][D]=1;
    cost[S][i]=0;
    cap[S][i]=1;
   }
  ki<<Flux()<<'\n';
  ki.close();
  return 0;
 }