Cod sursa(job #3030369)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 17 martie 2023 17:16:49
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("hamilton.in");

ofstream fout("hamilton.out");

int adi[20][20];

int dp[20][(1 << 17) + 4]; // dp[nod][conf] = costul minim ca sa se ajunga in nodul nod trecand exact prin

// nodurile cu 1 din conf

int N, M;

int main()
{
    fin >> N >> M;
    int a, b, c;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            adi[i][j] = INT_MAX;
        }
    }
    for (int i = 1; i <= M; i++)
    {
        fin >> a >> b >> c;
        adi[a][b] = c;
    }
    for (int conf = 1; conf < (1 << (N - 1)); conf++)
    {
        for (int i = 0; i < N; i++)
        {
            dp[i][conf] = INT_MAX;
        }
    }
    for (int i = 0; i < N; i++)
    {
        dp[i][(1 << (i - 1))] = adi[0][i];
    }
    dp[0][0] = 0;
    for (int conf = 1; conf < (1 << (N - 1)); conf++)
    {
        for (int nodnou = 1; nodnou < N; nodnou++)
        {

            if ((conf & (1 << (nodnou - 1))) == 0)
            {

                for (int nodvechi = 1; nodvechi < N; nodvechi++)
                {

                    if ((conf & (1 << (nodvechi - 1))) != 0 && adi[nodvechi][nodnou] < INT_MAX)
                    {
                        dp[nodnou][conf ^ (1 << (nodnou - 1))] = min(dp[nodnou][conf ^ (1 << (nodnou - 1))], dp[nodvechi][conf] + adi[nodvechi][nodnou]);
                    }
                }
            }
        }
    }
    int rez = INT_MAX;
    for (int i = 1; i < N; i++)
    {
        rez = min(rez, dp[i][(1 << (N - 1)) - 1] + adi[i][0]);
    }
    if (rez == INT_MAX)
    {

        fout << "Nu exista solutie";
    }
    else
    {
        fout << rez;
    }
    return 0;
}