Cod sursa(job #1479779)

Utilizator Burbon13Burbon13 Burbon13 Data 1 septembrie 2015 12:09:09
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

const int nmx = 19;
const int inf = 0x3f3f3f3f;
const int pt = (1 << 18) + 1;

int n, m, cost[nmx][nmx], dp[pt][nmx];
vector <int> g[nmx];

int main(){
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i){
        int nod1, nod2;
        scanf("%d %d", &nod1, &nod2);
        g[nod1].push_back(nod2);
        scanf("%d", &cost[nod1][nod2]);
        cost[nod2][nod1] = cost[nod1][nod2];
    }

    memset(dp, inf, sizeof(dp));
    dp[1][0] = 0;

    for(int i = 0; i < (1 << n); ++i)
        for(int j = 0; j < n; ++j)
            if(i & (1 << j))
                for(int v = 0; v < g[j].size(); ++v)
                    if(i & (1 << g[j][v]))
                        dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][g[j][v]] + cost[g[j][v]][j]);

    int sol = inf;
    for(int i = 0; i < g[0].size(); ++i)
         sol = min(sol, dp[(1 << n) - 1][g[0][i]] + cost[0][g[0][i]]);

    if(sol == inf)
            printf("Nu exista solutie\n");
    else
        printf("%d\n", sol);

    return 0;
}