Cod sursa(job #2787238)

Utilizator Ionut10Floristean Ioan Ionut10 Data 22 octombrie 2021 19:22:50
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define NMax 18

using namespace std;

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

const int INF = 1e9;
int n, m;
int x, y, c;
int dp[(1 << NMax) + 1][NMax + 1];
vector<pair<int, int> > adj[NMax + 1];

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

    for ( int mask = 0; mask < (1 << n); mask++ )
        for ( int i = 0; i < n; i++ )
            dp[mask][i] = INF;

    dp[1][0] = 0;

    for ( int mask = 0; mask < (1 << n); mask++ )
        for ( int i = 0; i < n; i++ )
            if ( mask & (1 << i ) )
                for ( auto j: adj[i] )
                    if ( mask & (1 << j.first) )
                        dp[mask][i] = min(dp[mask][i], dp[mask ^ (1 << i)][j.first] + j.second);

    int ans = INF;
    for ( auto u: adj[0] )
        ans = min(ans, dp[(1 << n) - 1][u.first] + u.second);
    if ( ans == INF ) fout << "Nu exista solutie";
    else fout << ans;
    return 0;
}