Cod sursa(job #194397)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 10 iunie 2008 13:37:24
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
# include <stdio.h>

# define FIN "cc.in"
# define FOUT "cc.out"
# define MAXN 204
# define inf 0X3f3f3f3f

int N, i, j, first, last;
int cap[MAXN][MAXN];
int cost[MAXN][MAXN];
int coada[MAXN*MAXN];
int d[MAXN];
int T[MAXN];
unsigned char s[MAXN];

  int bellman()
  {
      int nod;
      s[0]=1;
      coada[1]=0;
      for (i = 1; i <= 2*N+1; ++i)
        d[i]=inf;
      d[0]=0;
      T[0]=-1;
      first=1; last=2;
      while (first<last)
        {
            nod = coada[first];
            s[nod]=0;
            first++;
            for (i = 0; i <= 2*N+1; ++i)
              if (cap[nod][i]==1 && d[nod]+cost[nod][i]<d[i])
                {
                    d[i]=d[nod]+cost[nod][i];
                    if (s[i]==0)
                      {
                         coada[last++]=i;
                         s[i]=1;
                      }
                    T[i]=nod;
                }
        }
        
      if (d[2*N+1]==inf) return 0;
      
      int aux;
      aux=2*N+1;
      while (T[aux]!=-1)
        {
            cap[T[aux]][aux]=0;
            cap[aux][T[aux]]=1;
            aux=T[aux];
        }
        
       return 1;
  }  

  void flux()
  {
       int rez = 0;
       
       while (bellman()==1);
       
       for (i = 1; i <= N; ++i)
         for (j = N+1; j <= 2*N+1; ++j)
           if (cap[i][j]==0) rez+=cost[i][j];
           
       printf("%d",rez); 
         
  }  

  int main()
  {
      freopen(FIN,"r",stdin);
      freopen(FOUT,"w",stdout);
      
      scanf("%d",&N);
      
      for (i = 1; i <= N; ++i)
        for (j = N+1; j <= 2*N; ++j)
          {
               scanf("%d",&cost[i][j]);
               cost[j][i]=-cost[i][j];
               cap[i][j]=1;
          }
          
      for (i = 1; i <= N; ++i)
        cap[0][i]=1;
        
      for (i = N+1; i <= 2*N; ++i)
        cap[i][2*N+1]=1;
        
      flux();
      
      return 0;
  }