Cod sursa(job #1758178)

Utilizator Burbon13Burbon13 Burbon13 Data 16 septembrie 2016 18:39:06
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

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

int n,m;
int cost[nmx][nmx];
int dp[(1<<(nmx-1))][nmx];
int ans = inf;
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 calculus()
{
    dp[1][0] = 0;

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

void afish()
{
    if(ans == inf)
        printf("Nu exista solutie\n");
    else
        printf("%d\n", ans);
}

int main()
{
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    citire();
    memset(dp,inf,sizeof(dp));
    calculus();
    afish();
    return 0;
}