Pagini recente » Cod sursa (job #1527149) | Cod sursa (job #70112) | Cod sursa (job #319200) | Cod sursa (job #1262800) | Cod sursa (job #432219)
Cod sursa(job #432219)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 18
#define INF 0x3f3f3f3f
int n, m, sol, aux;
int C[Nmax][Nmax], D[Nmax][1 << 18];
int V[Nmax][Nmax];
int hamilton (int i, int stare) {
if (D[i][stare] != -1)
return D[i][stare];
D[i][stare] = INF;
for (int j = 1; j <= V[i][0]; j++)
if ( (stare >> V[i][j])&1) {
if (V[i][j] == 0 && stare != (1 + (1 << i)))
continue;
aux = hamilton(V[i][j], stare ^ (1 << i)) + C[V[i][j]][i];
if (D[i][stare] > aux) D[i][stare] = aux;
}
return D[i][stare];
}
int main () {
freopen ("hamilton.in", "r", stdin);
freopen ("hamilton.out", "w", stdout);
int i, x, y, z;
scanf ("%d %d", &n, &m);
for (i = 0; i < n; i++) {
memset (D[i], -1, sizeof (D[i]));
memset (C[i], INF, sizeof (C[i]));
}
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &z);
V[y][ ++V[y][0] ] = x;
C[x][y] = z;
}
D[0][1] = 0;
sol = INF; int aux;
for (i = 1; i <= V[0][0]; i++) {
aux = hamilton (V[0][i], (1 << n) - 1 ) + C[ V[0][i] ][0];
if (sol > aux) sol = aux;
}
if (sol != INF) printf ("%d", sol);
else printf ("Nu exista solutie");
return 0;
}