Cod sursa(job #3255889)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 12 noiembrie 2024 17:10:47
Problema Ciclu hamiltonian de cost minim Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

const int Nmax = 19, inf = 0x3f3f3f;

int v[Nmax + 1][Nmax + 1];
int dp[(1 << (Nmax - 1))][Nmax];

int main()
{
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        v[x][y] = c;
    }

    memset(dp, inf, sizeof dp);
    dp[1][0] = 0;

    for (int mask = 1; mask < (1 << n); ++mask)
    {
        for (int j = 1; j < n; j++)
        {
            if ((mask & (1 << j)) != 0)
            {
                int prev = mask - (1 << j);
                if (prev)
                {
                    for (int k = 0; k < n; k++)
                    {
                        if ((prev & (1 << k)) != 0)
                        {
                            if (v[k][j] > 0)
                                dp[mask][j] = min(dp[mask][j], dp[prev][k] + v[k][j]);
                        }
                    }
                }
            }
        }
    }
    int sol = inf;
    for (int j = 1; j < n; j++)
    {
        if (v[j][0] > 0)
        {
            sol = min(sol, v[j][0] + dp[(1 << n) - 1][j]);
        }
    }

    if (sol != inf)
        fout << sol << '\n';
    else
        fout << "Nu exista solutie" << '\n';
    return 0;
}