Cod sursa(job #2935359)

Utilizator AswVwsACamburu Luca AswVwsA Data 6 noiembrie 2022 16:40:54
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <climits>
#include <vector>
using namespace std;

const int NMAX = 19;
int dp[NMAX][(1 << NMAX)];
int cost[NMAX][NMAX];

vector <int> g[NMAX];

int main() {
    ifstream cin("hamilton.in");
    ofstream cout("hamilton.out");
    int n, m, i, mask, j;
    cin >> n >> m;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            cost[i][j] = INT_MAX / 2;
    for (i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        cost[a][b] = c;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    for (mask = 0; mask < (1 << n); mask++)
        for (i = 0; i < n; i++)
            dp[i][mask] = INT_MAX / 2;
    dp[0][1] = 0;
    for (mask = 1; mask < (1 << n); mask++) {
        for (i = 0; i < n; i++)
            if (mask & (1 << i))
                for (int u : g[i])
                    if (mask & (1 << u))
                        dp[i][mask] = min(dp[u][mask - (1 << i)] + cost[u][i], dp[i][mask]);
    }
    int ans = INT_MAX / 2;
    for (i = 0; i < n; i++) {
        ans = min(ans, dp[i][(1 << n) - 1] + cost[i][0]);
        //cout << dp[i][(1 << n) - 1] << "\n";
    }
    if (ans == INT_MAX / 2)
        cout << "Nu exista solutie";
    else
        cout << ans;
}