Pagini recente » Cod sursa (job #3148253) | Cod sursa (job #213532) | Cod sursa (job #2009275) | Cod sursa (job #1354350) | Cod sursa (job #918984)
Cod sursa(job #918984)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std ;
#define maxn 20
#define maxd 262145
#define inf 10000000
int n, m ;
int N ;
int rez = inf ;
int cost[maxn][maxn] ;
int sol[maxd][maxn] ;
void citire()
{
scanf("%d%d", &n, &m);
N = ( 1 << n ) ;
for(int i = 0; i < n; ++i )
for(int j = 0; j < n; ++j )
cost[i][j] = inf ;
for(int i = 1; i <= m; ++i )
{
int x, y, c ;
scanf("%d%d%d", &x, &y, &c);
cost[x][y] = c ;
}
}
void init()
{
for(int i = 1; i < N; ++i )
for(int j = 0; j < n; ++j )
sol[i][j] = inf ;
sol[1][0] = 0 ;
}
int calc(int sub, int nod)
{
int x = inf ;
for(int i = 0; i < n; ++i )
if( sub & ( 1 << i ) > 0 && cost[i][nod] < inf )
x = min( x, sol[sub][i] + cost[i][nod] ) ;
return x ;
}
int main()
{
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
citire() ;
init() ;
for(int i = 2; i < N; ++i )
for(int j = 0; j < n; ++j )
if( i & ( 1 << j ) > 0 )
sol[i][j] = calc( i ^ ( 1 << j ), j ) ;
for(int i = 0; i < n; ++i )
if( cost[i][0] < inf )
rez = min( rez, cost[i][0] + sol[N-1][i] ) ;\
if( rez < inf )
printf("%d\n", rez);
else
puts("Nu exista solutie");
return 0 ;
}