Pagini recente » Cod sursa (job #869336) | Cod sursa (job #1107750) | Cod sursa (job #2441089) | Cod sursa (job #866760) | Cod sursa (job #2544712)
#include <iostream>
#include <stdio.h>
#define NMAX 18
#define INFINIT 1000000000
using namespace std;
struct muchie {
int to ;
int cost ;
};
int mat [ NMAX + 1 ] [ NMAX + 1 ] ;
int d [ 1 << (NMAX+1)] [ NMAX + 1 ] ;
int hamilton (int nod, int mask, int n) {
if (d[mask][nod] != INFINIT )
return d[mask][nod] ;
else {
for (int i = 0 ; i < n ; i++ ) {
if (mat[i][nod] > 0 ) {
if (mask & (1 << i)) {
if (!(mask != (1 << nod) + 1 && mat[0][i] == 0 ) )
d[mask][nod] = std::min(d[mask][nod], hamilton(i, mask ^ (1 << nod), n) + mat[i][nod]) ;
}
}
}
return d[mask][nod] ;
}
}
int main() {
FILE *fin, *fout ;
fin = fopen ("hamilton.in", "r" ) ;
fout = fopen ("hamilton.out", "w" ) ;
int n, m, i, u, v, cost, j, minim ;
fscanf (fin, "%d%d", &n, &m ) ;
for (i = 0 ; i < m ; i++ ) {
fscanf (fin, "%d%d%d", &u, &v, &cost ) ;
mat[v][u] = cost ; /// muchiile invers
}
for (i = 0 ; i < n ; i++ ) {
for (j = 0 ; j < (1 << n) ; j++ )
d[i][j] = -1 ;
}
minim = INFINIT ;
d[1][0] = 0 ;
for (i = 1 ; i < n ; i++ )
if (mat[i][0] > 0 )
minim = std::min(minim, hamilton(i, (1 << n) - 1, n) + mat[i][0] ) ;
fprintf (fout, "%d", minim ) ;
return 0;
}