Cod sursa(job #1798709)

Utilizator tgm000Tudor Mocioi tgm000 Data 5 noiembrie 2016 12:59:13
Problema Ciclu hamiltonian de cost minim Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<cstdio>
#include<vector>
using namespace std;
int d[18][262144];
struct ceva{int nod,cost;};
vector <ceva> g[18];
int mini(int a,int b){
  if(a<b)
    return a;
  else
    return b;
}
int main(){
  int n,m,i,k,p,cs,j,mask,ans;
  ceva c;
  freopen("hamilton.in","r",stdin);
  freopen("hamilton.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(i=1;i<=m;i++){
      scanf("%d%d%d",&k,&p,&cs);
      c.nod=k;
      c.cost=cs;
      g[p].push_back(c);
  }
  for(i=0;i<n;i++)
      for(j=0;j<(1<<n);j++)
        d[i][j]=2e9;
  d[0][1]=0;
  for(mask=0;mask<(1<<n);mask++)
    for(i=0;i<n;i++)
      if(mask&(1<<i))
        for(j=0;j<g[i].size();j++){
            k=g[i][j].nod;
            if(mask&(1<<k))
              d[i][mask]=mini(d[i][mask],d[k][mask-(1<<i)]+g[i][j].cost);
        }
  ans=2e9;
  for(i=0;i<g[0].size();i++)
    ans=mini(ans,d[g[0][i].nod][(1<<n)-1]+g[0][i].cost);
  if(ans==2e9)
    printf("Nu exista solutie");
  else
    printf("%d",ans);
  return 0;
}