Pagini recente » Cod sursa (job #1965761) | Cod sursa (job #2237903) | Cod sursa (job #377793) | Cod sursa (job #548669) | Cod sursa (job #1456673)
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#define inf 0x3f3f3f3f
#define maxx 263000
#define nmx 20
using namespace std;
int n, m;
int cost[nmx][nmx];
int c[maxx][nmx];
vector <int> g[nmx];
int calc(const int conf, const int nod) {
if(c[conf][nod] == -1) {
c[conf][nod] = inf;
for(size_t i = 0; i < g[nod].size(); ++i)
if(conf & (1 << g[nod][i])) {
if(g[nod][i] == 0 && conf != (1<<nod)+1)
continue;
c[conf][nod] = min(c[conf][nod], calc(conf^(1<<nod),g[nod][i]) + cost[g[nod][i]][nod]);
}
}
return c[conf][nod];
}
int main() {
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
memset(c, -1, sizeof(c));
c[1][0] = 0;
memset(cost, inf, sizeof(cost));
scanf("%d %d", &n, &m);
for(; m; --m) {
int n1, n2, C;
scanf("%d %d %d", &n1, &n2, &C);
g[n2].push_back(n1);
cost[n1][n2] = C;
}
int sol = inf;
for(size_t i = 0; i < g[0].size(); ++i)
sol = min(sol,calc((1 << n) - 1, g[0][i]) + cost[g[0][i]][0]);
if(sol == inf)
printf("Nu exista solutie!\n");
else
printf("%d\n", sol);
return 0;
}