Cod sursa(job #651169)

Utilizator ChiroscaIrimiaEchipa Chirosca Irimia ChiroscaIrimia Data 19 decembrie 2011 23:21:15
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.66 kb
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int cost[20][20],M[(1<<20)][20],res[(1<<20)][20];

int min(int a,int b)
   {
    if(a<b) return a;
    return b;
   }
int main()
{
   FILE *f;
   f=fopen("hamilton.in","r");
   int i,j,n,m,x,y,k,v,infinit=(1<<27);
   fscanf(f,"%d%d",&n,&m);
   
   for(i=0;i<=n;i++)
      for(j=0;j<=n;j++)
         cost[i][j]=infinit;
   
   for(i=0;i<m;i++)
      fscanf(f,"%d%d%d",&x,&y,&cost[x][y]);
   
   for(i=0;i<n;i++)
      for(j=0;j<(1<<n);j++)
         {
          M[j][i]=infinit;
          res[j][i]=infinit;
         }
   M[1][0]=res[1][0]=0;
         
   for(j=0;j<(1<<n);j++)
      for(k=0;k<n;k++)
         if(j&(1<<k))
           for(v=0;v<n;v++)
              if(j&(1<<v))
                if(cost[v][k]!=infinit)
                  if(v!=k)
                    M[j][k]=min(M[j][k],M[j-(1<<k)][v]+cost[v][k]);
                    
                    
   
   /* for (j = 0; j < (1 << n); ++j)
        for (k = 0; k < n; ++k) 
           {
            if (j & (1 << k))
              for (v = 0; v < n; ++v) 
                 {
                  if (j & (1 << v))
                    if (!(cost[v][k] == infinit))
                      if (!(v == k))
                        res[j][k] = min(res[j][k], res[j - (1 << k)][v] + cost[v][k]);
                 } 
           } */                   
                  
                  
   x=infinit;
   for(i=0;i<n;i++)
      if(M[(1<<n)-1][i]!=infinit) 
        x=min(x,M[(1<<n)-1][i]);
   fclose(f);
   f=fopen("hamilton.out","w");

   
   
   fprintf(f,"%d",x);
   fclose(f);
   //getch();               
   return 0;
}