Cod sursa(job #292035)

Utilizator drag0shSandulescu Dragos drag0sh Data 30 martie 2009 18:26:00
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define maxn 205
#define inf 1000000000
#define nume "cc"

FILE *in=fopen(nume".in","r"),*out=fopen(nume".out","w");

int n,m,source,dest;
int drum,l;

int g[maxn],dist[maxn],from[maxn];
int q[maxn],u[maxn];
int c[maxn][maxn],f[maxn][maxn],cost[maxn][maxn],a[maxn][maxn];

void citire(){
  int i,j,z;
  fscanf(in,"%d",&n);
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++){
      fscanf(in,"%d",&z);
      cost[i][n+j]=z;
      cost[n+j][i]=-z;
      c[i][n+j]=1;
    }
  source=2*n+1;
  dest=source+1;
  for(i=1;i<=n;i++){
    c[source][i]=1;
    c[n+i][dest]=1;
  }
  for(i=1;i<=n;i++){
    for(j=0;j<n;j++){
      a[i][j]=n+j+1;
      a[n+i][j]=j+1;
    }
    a[i][n]=source;
    a[source][i-1]=i;
    a[n+i][n]=dest;
    a[dest][i-1]=n+i;
    g[i]=n+1;
    g[n+i]=n+1;
  }
  g[dest]=n;
  g[source]=n;
}

int bellmanford(){
  int i,j,k;
  for(i=1;i<=dest;i++){
    dist[i]=inf;
    from[i]=-1;
    u[i]=0;
  }
  dist[source]=0;
  l=1;
  q[l]=source;
  u[source]=1;
  for(i=1;i<=l;i++){
    k=q[i];
    for(j=0;j<g[k];j++){
      if(c[k][a[k][j]]>f[k][a[k][j]]&&dist[k]+cost[k][a[k][j]]<dist[a[k][j]]){
	dist[a[k][j]]=dist[k]+cost[k][a[k][j]];
	from[a[k][j]]=k;
	if(!u[a[k][j]]){
	  q[++l]=a[k][j];
	  u[a[k][j]]=1;
	}
      }
    }
      u[k]=0;
  }
  if(dist[dest]!=inf){
    int vmin=inf;
    drum=1;
    for(i=dest;i!=source;i=from[i])vmin=min(vmin,c[from[i]][i]-f[from[i]][i]);
    for(i=dest;i!=source;i=from[i]){
      f[from[i]][i]=+vmin;
      f[i][from[i]]=-vmin;
    }
    return vmin*dist[dest];
  }
  return 0;
}

long flux(){
  long rez=0;
  drum=1;
  while(drum){
    drum=0;
    rez+=bellmanford();
  }
  return rez;
}

int main(){
  citire();
  fprintf(out,"%ld",flux());
  //  printf("(%d)",n);
  fclose(in);
  fclose(out);
  return 0;
}