Pagini recente » Cod sursa (job #243870) | Cod sursa (job #2333652) | Cod sursa (job #1387410) | Cod sursa (job #516116) | Cod sursa (job #2478250)
#include <cstdio>
#include <vector>
using namespace std;
const int INF = 2.e9;
vector <int> G[25];
int cost[25][25] , c[262150][25];
int main()
{
freopen("hamilton.in" , "r" , stdin);
freopen("hamilton.out" , "w" , stdout);
int n , m , u , v , i , j , p , lim , k , cmin;
scanf("%d%d" , &n , &m);
for(i = 0 ; i < n ; i ++)
for(j = 0 ; j < n ; j ++)
cost[i][j] = INF;
for(i = 1 ; i <= m ; i ++)
{
scanf("%d%d%d" , &u , &v , &p);
cost[u][v] = p;
G[v].push_back(u);
}
lim = (1 << n) - 1;
for(i = 0 ; i <= lim ; i ++)
for(j = 0 ; j < n ; j ++)
c[i][j] = INF;
c[1][0] = 0;
for(i = 0 ; i <= lim ; i ++)
for(j = 0 ; j < n ; j ++)
if(i & (1 << j))
for(k = 0 ; k < G[j].size() ; k ++)
if(i & (1 << G[j][k]))
c[i][j] = min(c[i][j] , c[i^(1 << j)][G[j][k]] + cost[G[j][k]][j]);
cmin = INF;
for(j = 0 ; j < G[0].size() ; j ++)
cmin = min(cmin , c[lim][G[0][j]] + cost[G[0][j]][0]);
if(cmin == INF)
printf("Nu exista solutie\n");
else
printf("%d\n" , cmin);
return 0;
}