Cod sursa(job #3198245)

Utilizator Maftei_TudorMaftei Tudor Maftei_Tudor Data 28 ianuarie 2024 15:39:32
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <math.h>

using namespace std;
ifstream in("hamilton.in");
ofstream out("hamilton.out");
const int N = 20, inf = 2e9;

int n, m, dp[1<<18][N], a[N][N];

int main()
{
    in >> n >> m;
    for(int i=1; i<=m; i++) {
        int x, y, c;
        in >> x >> y >> c;
        a[x][y] = c;
    }

    dp[1][0] = 1;
    for(int j=2; j<(1<<n); j++) {
        int pw = 1, cnt = 0;
        while(pw <= j) {
            if(j & pw) {
                int mask = j ^ pw;
                if(mask) {
                    dp[j][cnt] = inf;
                    for(int i=0; i<n; i++)
                        if(a[i][cnt] && dp[mask][i])
                            dp[j][cnt] = min(dp[j][cnt], dp[mask][i] + a[i][cnt]);
                }
            }

            pw *= 2;
            cnt++;
        }
    }

    int ans = inf;
    for(int i=0; i<n; i++)
        if(dp[(1<<n)-1][i] && a[i][0])
            ans = min(ans, dp[(1<<n)-1][i] + a[i][0]);

    if(ans == inf)
        out << "Nu exista solutie";
    else
        out << ans - 1;
    return 0;
}