Cod sursa(job #2083165)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 7 decembrie 2017 09:13:02
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#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;
}