Cod sursa(job #3361958)

Utilizator cont_superscoalaSuperScoala cont_superscoala Data 30 iulie 2026 16:04:51
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
/*
https://infoarena.ro/problema/hamilton
*/
#include <fstream>

using namespace std;

const int N = 18;
const int INF = 1e8;

int cost[N][N], c[1<<N][N];

int main()
{
    ifstream in("hamilton.in");
    ofstream out("hamilton.out");
    int n, m;
    in >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i != j)
            {
                cost[i][j] = INF;
            }
        }
    }
    for (int i = 0; i < m; i++)
    {
        int x, y;
        in >> x >> y;
        in >> cost[x][y];
    }
    in.close();
    for (int s = 1; s < (1 << n); s += 2)
    {
        for (int j = 0; j < n; j++)
        {
            c[s][j] = INF;
        }
    }
    c[1][0] = 0;
    for (int s = 3; s < (1 << n); s += 2)
    {
        for (int j = 1; j < n; j++)
        {
            if (s & (1 << j))
            {
                for (int k = 0; k < n; k++)
                {
                    if (s & (1 << k))
                    {
                        int s_j = (s ^ (1 << j));
                        c[s][j] = min(c[s][j], c[s_j][k] + cost[k][j]);
                    }
                }
            }
        }
    }
    int cost_min = INF;
    for (int j = 1; j < n; j++)
    {
        cost_min = min(cost_min, c[(1 << n)-1][j] + cost[j][0]);
    }
    if (cost_min == INF)
    {
        out << "Nu exista solutie\n";
    }
    else
    {
        out << cost_min << "\n";
    }
    out.close();
    return 0;
}