Cod sursa(job #1894184)

Utilizator Burbon13Burbon13 Burbon13 Data 26 februarie 2017 16:31:56
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>

using namespace std;

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

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

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

void setare()
{
    for(int i = 0; i < (1 << n); ++i)
        for(int j = 0; j < n; ++j)
            dp[i][j] = inf;
}

void dinamica()
{
    dp[1][0] = 0;

    for(int i = 1; i < (1 << n); ++i)
        for(int p1 = 0; p1 < n; ++p1)
            if(i & (1 << p1))
                for(size_t p2 = 0; p2 < g[p1].size(); ++p2)
                    if(i & (1 << g[p1][p2]))
                        dp[i][p1] = min(dp[i][p1], dp[i - (1 << p1)][g[p1][p2]] + cost[g[p1][p2]][p1]);
}

void rezultat()
{
    int ans = inf;
    for(size_t i = 0; i < g[0].size(); ++i)
        ans = min(ans,dp[(1<<n)-1][g[0][i]] + cost[g[0][i]][0]);
    printf("%d\n", ans == inf ? -1 : ans);
}

int main()
{
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    citire();
    setare();
    dinamica();
    rezultat();
    return 0;
}