Cod sursa(job #3370640)

Utilizator Andreea11KPavel Andreea Andreea11K Data 26 octombrie 2026 16:02:23
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

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


const int InF = 100000000;
const int mAXn = 20;

int n, m, sol;
int cost[18][18];
int dp[1 << 18][18];
int main()
{
    fin >> n >> m;
    sol = InF;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cost[i][j] = InF;

    for(int i = 1; i <= m; i++)
    {
        int x, y;
        fin >> x >> y;
        fin >> cost[x][y];
    }
    for(int conf = 0; conf < (1<<n); conf++)
        for(int nod = 0; nod < n; nod++)
            dp[conf][nod] = InF;
    for(int conf = 1; conf < (1 << n); conf++)
    {
        for(int nod = 0; nod < n; nod++)
        {
            if(dp[conf][nod] == InF)
                continue;
            for(int vecin = 0; vecin < n; vecin++)
            {
                if (cost[nod][vecin] == InF)
                    continue;
                if (((conf >> vecin) & 1) == 0)
                {
                    int nou = conf | (1 << vecin);
                    int val = dp[conf][nod] + cost[nod][vecin];
                    if (val < dp[nou][vecin])
                        dp[nou][vecin] = val;
                }
            }
        }
    }
    int ans = InF;
    for(int nod = 0; nod < n; nod ++)
    {
        if(dp[(1<<n)-1][nod] != InF and cost[nod][0] != InF)
        {
            int val = dp[(1 << n) -1][nod] + cost[nod][0];
            ans = min(ans, val);
        }
    }
    if(ans == InF)
        fout << "Nu exista solutie";
    else
        fout << ans;
    return 0;
}