Pagini recente » Cod sursa (job #2508396) | Cod sursa (job #3187723) | Borderou de evaluare (job #2018267) | Borderou de evaluare (job #2021661) | Cod sursa (job #432201)
Cod sursa(job #432201)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define Nmax 18
#define INF 0x3f3f3f3f
int n, m, sol;
int C[Nmax][Nmax], D[Nmax][1 << Nmax + 2];
vector <int> V[Nmax];
int hamilton (int i, int stare) {
if (D[i][stare] != -1)
return D[i][stare];
D[i][stare] = INF;
for (vector <int>::iterator it = V[i].begin (); it != V[i].end (); it++)
if ( (stare >> *it)&1 )
D[i][stare] = min (D[i][stare], hamilton(*it, stare ^ (1 << i)) + C[*it][i]);
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].push_back (x);
C[x][y] = z;
}
D[0][1] = 0;
sol = INF;
for (i = 0; i < n; i++)
if (C[i][0] != INF)
sol = min (sol, hamilton (i, (1 << n) - 1 ) + C[i][0] );
if (sol != INF) printf ("%d", sol);
else printf ("Nu exista solutie");
return 0;
}