Cod sursa(job #1491566)

Utilizator azkabancont-vechi azkaban Data 25 septembrie 2015 17:59:50
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f

int n,m,a,b,c;
int path[25][25];
int dp[1<<19][19];

int main(void){
 ifstream cin("hamilton.in");
 ofstream cout("hamilton.out");
 cin>>n>>m;
 memset(path,0,sizeof path);
 while(m--){
     cin>>a>>b>>c;
     path[a][b] = c;
 }
memset(dp,inf,sizeof dp);
//bottom-up bitmask_dp
dp[1][0]=0;
int ans= inf;
 for (int mask = 0; mask<(1<<n); ++mask)
    for (int i=0; i<n; ++i)
       if (mask&(1<<i))
          for (int j=0; j<n; ++j)
            if (path[i][j]>0)
              if (!(mask&(1<<j)))
                dp[mask|(1<<j)][j] = min(dp[mask|(1<<j)][j],dp[mask][i] + path[i][j]);
//count solution
int sol = inf;
for (int i=0;i<n;++i)
  if (path[i][0]>0)
    sol = min(sol,dp[(1<<n)-1][i] + path[i][0]);
if (sol!=inf) cout<<sol;
     else cout<<"Nu exista solutie";

return 0;
}