Pagini recente » Cod sursa (job #579263) | Cod sursa (job #1271972) | Cod sursa (job #1431606) | Cod sursa (job #628404) | Cod sursa (job #2364237)
#include <bits/stdc++.h>
#define INFINIT 110000000
int d[1 << 18][18], cost[18][18];
int mn( int a, int b ) {
return a < b ? a : b;
}
int main() {
FILE *fin, *fout;
int n, m, a, b, c, i, j, ii, k, s = INFINIT;
fin = fopen( "hamilton.in", "r" );
fout = fopen( "hamilton.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for ( i = 0; i < n; i++ )
for ( j = 0; j < n; j++ )
if ( i != j )
cost[i][j] = INFINIT;
for ( i = 0; i < ( 1 << 18 ); i++ )
for ( j = 0; j < n; j++ )
d[i][j] = INFINIT;
for ( i = 0; i < m; i++ ) {
fscanf( fin, "%d%d%d", &a, &b, &c );
cost[a][b] = c;
}
d[1][0] = 0;
for ( i = 3; i < ( 1 << n ); i += 2 ) {
for ( j = 0; j < n; j++ ) {
if ( i & ( 1 << j ) ) {
ii = i ^ ( 1 << j );
for ( k = 0; k < n; k++ ) {
if ( ( ii & ( 1 << k ) ) && k != j )
d[i][j] = mn( d[i][j], d[ii][k] + cost[k][j] );
}
}
}
}
for ( i = 0; i < n; i++ )
s = mn( s, d[( 1 << n ) - 1][i] + cost[i][0] );
if ( s >= INFINIT )
fprintf( fout, "Nu exista solutie" );
else
fprintf( fout, "%d", s );
fclose( fin );
fclose( fout );
return 0;
}