Cod sursa(job #2547315)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 15 februarie 2020 11:14:26
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <math.h>
#include <string.h>
using namespace std;

ifstream f("hamilton.in");
ofstream g("hamilton.out");

const int INF = 1069531071;
int dp[20][262200];
int cost[20][20];
int n, m;

void init()
{
    for(int i = 0; i<n; i++)
    {
        for(int j = 0; j<(1<<n); j++)
        {
            dp[i][j] = -1;
        }
    }
    for(int i = 0; i<n; ++i)
        for(int j = 0; j<n; ++j)
            cost[i][j] = INF;
    dp[0][1] = 0;
}

void citire()
{
    f>>n>>m;
    init();
    int x, y, c;
    for(int i = 0; i<m; ++i)
    {
        f>>x>>y>>c;
        cost[x][y] = c;
    }
}

int calcCostMin(int i, int j)
{
    if(dp[i][j] == -1) {
        dp[i][j] = INF;
        if(j == 1 + (1 << i))
        {
            dp[i][j] = cost[0][i];
            return dp[i][j];
        }
        for(int x = 1; x<n; ++x)
        {
            if(cost[x][i] != INF && ((1<<x) & j) != 0)
                dp[i][j] = min(dp[i][j], calcCostMin(x, (j^(1<<i))) + cost[x][i]);
        }
    }
    return dp[i][j];
}

void solve()
{
    int minim = INF;
    for(int i = 1; i<n; ++i)
    {
        if(cost[i][0] != INF)
            minim = min(minim, calcCostMin(i, (1<<n)-1) + cost[i][0]);
    }
    if(minim != INF)
        g<<minim;
    else
        g<<"Nu exista solutie";
}

int main()
{
    citire();
    solve();
    return 0;
}