Pagini recente » Cod sursa (job #850180) | Cod sursa (job #1244442) | Cod sursa (job #3247124) | Cod sursa (job #2454190) | Cod sursa (job #2083165)
#include <cstdio>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;
vector <int> g[30];
int cost[20][20];
int dp[(1 << 18) + 5][20];
int main() {
freopen("hamilton.in", "r", stdin);
freopen("hamilton.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; ++ i) {
int x, y;
scanf("%d%d", &x, &y);
scanf("%d", &cost[x][y]);
g[y].push_back(x);
}
for(int state = 1; state < (1 << n); ++ state) {
for(int nod = 0; nod < n; ++ nod) {
dp[state][nod] = INT_MAX / 2;
}
}
dp[1][0] = 0;
for(int state = 1; state < (1 << n); ++ state) {
for(int nod = 0; nod < n; ++ nod) {
if(state & (1 << nod)) {
for(int k = 0; k < g[nod].size(); ++ k) {
int nodFrom = g[nod][k];
if(state & (1 << nodFrom)) {
dp[state][nod] = min(dp[state][nod], dp[state - (1 << nod)][nodFrom] + cost[nodFrom][nod]);
}
}
}
}
}
int sum = INT_MAX;
for(int nod = 0; nod < n; ++ nod) {
if(cost[nod][0] > 0 && dp[(1 << n) - 1][nod] < INT_MAX / 2)
sum = min(sum, dp[(1 << n) - 1][nod] + cost[nod][0]);
}
if(sum == INT_MAX) {
printf("Nu exista solutie");
} else {
printf("%d\n", sum);
}
return 0;
}