Pagini recente » Cod sursa (job #1938487) | Cod sursa (job #1876087) | Cod sursa (job #41143) | Cod sursa (job #2894584) | Cod sursa (job #1947864)
/**
* Worg
*/
#include <cstdio>
#include <algorithm>
FILE *fin = freopen("hamilton.in", "r", stdin);
FILE *fout = freopen("hamilton.out", "w", stdout);
const int kMaxN = 18;
const int kMaxMask = 1 << kMaxN;
const int kMaxInf = 1e9;
/*-------- Input data --------*/
int N, M;
int cost[kMaxN][kMaxN];
int neighbour_mask[kMaxN];
/*-------- Algorithm data --------*/
int bit[kMaxMask];
int dp[kMaxMask][kMaxN];
/*-------- --------*/
void ReadInput() {
scanf("%d%d", &N, &M);
for(int i = 1; i <= M; i++) {
int u, v, c; scanf("%d%d%d", &u, &v, &c);
cost[u][v] = c;
neighbour_mask[v] ^= (1 << u);
}
for(int i = 0; i < N; i++) {
bit[1 << i] = i;
}
}
int RunDp() {
int mask_limit = 1 << (N - 1);
for(int i = 0; i < mask_limit; i++) {
for(int j = 0; j < N; j++) {
dp[i][j] = kMaxInf;
}
}
dp[0][N - 1] = 0;
for(int mask = 1; mask < mask_limit; mask++) {
int tmp_mask = mask;
while(tmp_mask > 0) {
int new_mask = tmp_mask & (tmp_mask - 1);
int v = bit[tmp_mask ^ new_mask];
tmp_mask = new_mask;
/// Calculam dp[mask][v]
int config = neighbour_mask[v];
while(config > 0) {
int new_config = config & (config - 1);
int u = bit[config ^ new_config];
config = new_config;
dp[mask][v] = std::min(dp[mask][v], dp[mask ^ (1 << v)][u] + cost[u][v]);
}
}
}
int answer = kMaxInf;
for(int i = 0; i < N - 1; i++) {
if(cost[i][N - 1] != 0) {
answer = std::min(answer, dp[mask_limit - 1][i] + cost[i][N - 1]);
}
}
if(answer == kMaxInf) {
return -1;
} else {
return answer;
}
}
int main() {
ReadInput();
int solution = RunDp();
if(solution == -1) {
printf("Nu exista solutie\n");
} else {
printf("%d\n", solution);
}
return 0;
}