Cod sursa(job #432073)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 1 aprilie 2010 19:57:18
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
const int INF=1<<29;
int d[262145][18],c[18][18];

int main(){
  freopen("hamilton.in","r",stdin); freopen("hamilton.out","w",stdout);
  int n,m,i,j,k,x,y,z,L;
  
  scanf("%d %d",&n,&m);
  
  for (i=0;i<n;++i) for (j=0;j<n;++j) c[i][j]=INF;
  for (i=1;i<=m;++i){
    scanf("%d %d %d",&x,&y,&z);
    c[x][y]=z;
  }

  L=1<<n;
  for (i=0;i<L;++i)for (j=0;j<n;++j) d[i][j]=INF;
  d[1][0]=0;
  //for (i=1,j=0;i<L;i<<=1,j++)d[i][j]=0;
  for (i=0;i<L;++i)
    for (j=0;j<n;++j)
      if ((i&(1<<j)))
        for (k=0;k<n;++k)
          if (k!=j && (i&(1<<k)))
            if (d[i][j] > d[i^(1<<j)][k] + c[k][j])
              d[i][j] = d[i^(1<<j)][k] + c[k][j];
  x=d[L-1][0];
  for (i=1;i<n;++i)if (d[L-1][i]+c[i][0]<x)x=d[L-1][i]+c[i][0];
  
  if (x==INF)printf("Nu exista solutie\n"); else printf("%d\n",x);
return 0;
}