Cod sursa(job #2892288)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 21 aprilie 2022 17:01:27
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

#define MAX_N 18
#define MULT (1 << 29)

using namespace std;

int cost[MAX_N][MAX_N], dp[1 << MAX_N][MAX_N];
vector <int> invEdges[MAX_N];

int main() {
    ifstream cin( "hamilton.in" );
    ofstream cout( "hamilton.out" );

    int n, m, minCost, mask, u, v, c;

    cin >> n >> m;
    for ( u = 0; u < n; u++ ) {
        for ( v = 0; v < n; v++ )
            cost[u][v] = MULT;
    }

    while ( m-- ) {
        cin >> u >> v >> c;
        invEdges[v].push_back( u );
        cost[u][v] = c;
    }
    for ( mask = 1; mask < (1 << n); mask++ ) {
        for ( u = 0; u < n; u++ )
            dp[mask][u] = MULT;
    }
    dp[1][0] = 0;
    for ( mask = 1; mask < (1 << n); mask++ ) {
        for ( v = 0; v < n; v++ ) {
            if ( mask & (1 << v) ) {
                for ( int u: invEdges[v] ) {
                    if ( mask & (1 << u) )
                        dp[mask][v] = min( dp[mask][v], dp[mask - (1 << v)][u] + cost[u][v] );
                }
            }
        }
    }

    minCost = MULT;
    for ( u = 0; u < n; u++ )
        minCost = min( minCost, dp[(1 << n) - 1][u] + cost[u][0] );

    if ( minCost == MULT )
        cout << "Nu exista solutie";
    else
        cout << minCost;

    return 0;
}