Cod sursa(job #2868758)

Utilizator Madalin_IonutFocsa Ionut-Madalin Madalin_Ionut Data 11 martie 2022 10:13:12
Problema Ciclu hamiltonian de cost minim Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;

/**
dp[i][masca] = costul minim al drumului de la 0 la i, trecand prin
   nodurile marcate cu 1 in reprezentarea in baza 2 a lui masca
*/

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int a[18][18], n, m, N;
int dp[18][1 << 18];

void Citire()
{
    int i, j, c, k;
    fin >> n >> m;
    N = (1 << n);
    for (k = 1; k <= m; k++)
    {
        fin >> i >> j >> c;
        a[i][j] = c;
    }
}

void Dinamica()
{
    int i, j, masca, x;
    for (i = 0; i < n; i++)
        for (j = 0; j < N; j++)
            dp[i][j] = 2e9;
    dp[0][1] = 0;
    for (masca = 3; masca < N; masca += 2)
        for (i = 0; i < n && (1 << i) <= masca; i++)
            if (masca & (1 << i))
            {
                x = masca ^ (1 << i);
                for (j = 0; j < n; j++)
                    if (a[j][i] > 0 && ((x & (1 << j))))
                        dp[i][masca] = min(dp[i][masca],
                            dp[j][x] + a[j][i]);
            }
    x = 2e9;
    for (i = 1; i < n; i++)
        if (a[i][0] > 0 && x > dp[i][N - 1] + a[i][0])
            x = dp[i][N - 1] + a[i][0];
    if (x == 2e9) fout << "Nu exista solutie\n";
    else fout << x << "\n";
}

int main()
{
    Citire();
    Dinamica();
    fout.close();
    return 0;
}