Cod sursa(job #1947864)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 31 martie 2017 14:40:53
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
/**
  *  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;
}