Cod sursa(job #3297465)

Utilizator Arhiva_EducationalaArhiva Educationala Arhiva_Educationala Data 22 mai 2025 17:28:53
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 18;
const int INF = 1e9;

int cost[NMAX + 1][NMAX + 1];

int dp[NMAX][(1 << NMAX)];

int main() {
    ifstream fin( "hamilton.in" );
    ofstream fout( "hamilton.out" );
    int n, m;
    fin >> n >> m;
    for ( int i = 0; i < n; i ++ ) {
        for ( int j = 0; j < n; j ++ ) {
            cost[i][j] = INF;
        }
        cost[i][i] = 0;
    }
    for ( int i = 1, a, b, c; i <= m; i ++ ) {
        fin >> a >> b >> c;
        cost[a][b] = min( cost[a][b], c );
    }
    for ( int i = 0; i < n; i ++ ) {
        for ( int j = 0; j < (1 << n); j ++ ) {
            dp[i][j] = INF;
        }
    }
    for ( int i = 0; i < n; i ++ ) {
        dp[i][1 << i] = cost[0][i];
    }
    for ( int mask = 2; mask < (1 << n); mask ++ ) {
        for ( int last = 0; last < n; last ++ ) {
            if ( (1 << last) & mask ) {
                for ( int prv = 0; prv < n; prv ++ ) {
                    dp[last][mask] = min( dp[last][mask], dp[prv][mask ^ (1 << last)] + cost[prv][last] );
                }
            }
        }
    }
    int ans = dp[0][(1 << n) - 1];
    if ( ans == INF ) {
        fout << "Nu exista solutie\n";
    } else {
        fout << ans << '\n';
    }
    return 0;
}