Cod sursa(job #303734)

Utilizator drag0shSandulescu Dragos drag0sh Data 10 aprilie 2009 11:54:26
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;

#define oo 2000000000
#define N 205

vector <short int>a[N];
short int cost[N][N],n,cap[N][N],source,dest,path[N],t[N];
int d[N],flux,costflux,minim;

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

void citire(){
  short int i,j,c;
  fscanf(in,"%hd",&n);
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++){
      fscanf(in,"%hd",&c);
      cost[i][n+j]=c;
      cost[n+j][i]=-c;
      cap[i][n+j]=1;
    }
  source=2*n+1;
  dest=source+1;
  for(i=1;i<=n;i++){
    cap[source][i]=1;
    cap[n+i][dest]=1; 
    for(j=1;j<=n;j++){
      a[i].push_back(n+j);
      a[n+j].push_back(i);
    }
    a[source].push_back(i);
    a[i].push_back(source);
    a[dest].push_back(n+i);
    a[n+i].push_back(dest);
  }
}

void bellman(){
  bitset<N>v;queue<int>q;short int nod,fiu;
  int i,x;
 while(!q.empty())q.pop();
  q.push(source);
  for(i=1;i<=dest;i++){d[i]=oo;t[i]=0;v[i]=0;}
  d[source]=0;
  v[source]=1;
  while(!q.empty()){
    nod=q.front();
    q.pop();
    v[nod]=0;
    x=a[nod].size();
    for(i=0;i<x;i++){
      fiu=a[nod][i];
      if(cap[nod][fiu]){
	if(d[fiu]>d[nod]+cost[nod][fiu]){
	  d[fiu]=d[nod]+cost[nod][fiu];
	  t[fiu]=nod;
	  if(!v[fiu]){
	    q.push(fiu);
	    v[fiu]=1;
	  }
	}
      }
    }
  }

}

void calculare_flux(){
  int m,aux,i;
  do{
    bellman();
    if(d[dest]==oo) {
      //  for(i=1;i<=dest;i++)printf(" (%d) ",d[i]);
      //      printf("GURUR");
      break;}
    minim=oo;
    for(aux=dest,m=0;aux;path[++m]=aux,aux=t[aux]);
    for(i=1;i<m;i++)
      if(minim>cap[path[i+1]][path[i]])minim=cap[path[i+1]][path[i]];
    for(i=1;i<m;i++){
      cap[path[i+1]][path[i]]-=minim;
      cap[path[i]][path[i+1]]+=minim;
    }
    flux=minim;
    costflux+=minim*d[dest];
    //printf("(%d)",flux);
  }
  while(1);
}

/*
void afisare(){
  int i,j,x;
  for(i=1;i<=dest;i++){
    fprintf(out,"\n");
    x=a[i].size();
    for(j=0;j<x;j++){
      fprintf(out,"%hd ",a[i][j]);
    }
  }


}
*/

int main(){
  citire();
  calculare_flux();
  fprintf(out,"%d",costflux);
  // afisare();
  fclose(out);
  fclose(in);
  return 0;
}