Pagini recente » Cod sursa (job #293707) | Cod sursa (job #1843344) | Cod sursa (job #2150931) | Cod sursa (job #652083) | Cod sursa (job #432232)
Cod sursa(job #432232)
#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 18
#define INF 0x3f3f3f3f
int n, m, sol, aux;
int C[Nmax][Nmax], D[1 << Nmax][Nmax];
int V[Nmax][Nmax];
int hamilton (int i, int stare) {
if (D[stare][i] != -1)
return D[stare][i];
D[stare][i] = 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[stare][i] > aux) D[stare][i] = aux;
}
return D[stare][i];
}
int main () {
freopen ("hamilton.in", "r", stdin);
freopen ("hamilton.out", "w", stdout);
int i, j, x, y, z;
scanf ("%d %d", &n, &m);
for (i = 0; i < n; i++)
memset (C[i], INF, sizeof (C[i]));
int N = (1 << n);
for (i = 0; i < N; i++)
for (j = 0; j < n; j++)
D[i][j] = -1;
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &z);
V[y][ ++V[y][0] ] = x;
C[x][y] = z;
}
D[1][0] = 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;
}