Pagini recente » Cod sursa (job #2676139) | Cod sursa (job #2235788) | Cod sursa (job #866462) | Cod sursa (job #51847) | Cod sursa (job #1226477)
#include <cstdio>
#include <vector>
#define node first
#define cost second
using namespace std;
const int NMAX = 19, INFI = 2e9;
vector <pair <int, int> > G[NMAX];
int D[1 << NMAX][NMAX];
int main () {
freopen ("hamilton.in", "r", stdin);
freopen ("hamilton.out", "w", stdout);
vector <pair <int, int> > :: iterator k;
int N, M, a, b, c, l, i, j, ans = INFI;
scanf ("%d%d", &N, &M);
while (M--) {
scanf ("%d%d%d", &a, &b, &c);
G[b].push_back (make_pair (a, c));
}
l = 1 << N;
for (i = 3; i < l; i += 2) {
D[i][0] = INFI;
for (j = 1; j < N; ++j) {
D[i][j] = INFI;
if (i & (1 << j))
for (k = G[j].begin (); k != G[j].end (); ++k)
if (i & (1 << k->node))
D[i][j] = min (D[i][j], D[i ^ (1 << j)][k->node] + k->cost);
}
}
for (k = G[0].begin (); k != G[0].end (); ++k)
ans = min (ans, D[l - 1][k->node] + k->cost);
if (ans >= INFI)
printf ("Nu exista solutie");
else
printf ("%d", ans);
}