Cod sursa(job #1517160)

Utilizator Burbon13Burbon13 Burbon13 Data 3 noiembrie 2015 21:51:44
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

const int nmx = 19;
const int inf = 0x3f3f3f3f;

int n,m,dp[(1<<18)+1][nmx+2],cost[nmx][nmx];
vector <int> g[nmx];

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

int hamilton(){
    dp[1][0] = 0;
    for(int i = 0; i < (1 << n); ++i)
        for(int j = 0; j < n; ++j)
            if(i & (1 << j))
                for(size_t k = 0; k < g[j].size(); ++k)
                    if(i & (1 << g[j][k]))
                        dp[i][j] = min(dp[i][j],dp[i^(1 << j)][g[j][k]] + cost[g[j][k]][j]);
    int sol = inf;
    for(int k = 0; k < g[0].size(); ++k)
        sol = min(sol,dp[(1<<n)-1][g[0][k]] + cost[g[0][k]][0]);
    return sol;
}

int main(){
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    memset(cost,inf,sizeof(cost));
    memset(dp,inf,sizeof(dp));
    citire();
    int ras = hamilton();
    if(ras == inf)
        printf("Nu exista solutie\n");
    else
        printf("%d\n", ras);
    return 0;
}