Cod sursa(job #3359835)

Utilizator daviddxmqStan David Andrei daviddxmq Data 5 iulie 2026 11:02:33
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int MAXN = 20;
const int INF = 1e9;

vector<int> g[MAXN];

int n, m;
int cost_muchie[MAXN][MAXN];
int cicCostMin[MAXN][1 << MAXN];

int main() {
    in >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y, c;
        in >> x >> y >> c;
        g[x].push_back(y);
        cost_muchie[x][y] = c;
    }
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < (1 << n); ++j)
            cicCostMin[i][j] = INF;
    cicCostMin[0][0] = cicCostMin[0][1] = 0;
    for (int configuratie = 1; configuratie < (1 << n); ++configuratie){
        for (int nod = 0; nod < n; ++nod) {
            if (cicCostMin[nod][configuratie] == INF) continue;
            for (int vecin : g[nod]) {
                if (!(configuratie & (1 << vecin))) {
                    int next_conf = configuratie | (1 << vecin);
                    if (cicCostMin[vecin][next_conf] > cicCostMin[nod][configuratie] + cost_muchie[nod][vecin])
                        cicCostMin[vecin][next_conf] = cicCostMin[nod][configuratie] + cost_muchie[nod][vecin];
                }
            }
        }
    }
    int costul_minim = INF;
    int configuatie_completa = (1 << n) - 1;
    for (int nod = 0; nod < n; ++nod) {
        if (cicCostMin[nod][configuatie_completa] != INF && cost_muchie[nod][0] > 0)
            costul_minim = min(costul_minim, cicCostMin[nod][configuatie_completa] + cost_muchie[nod][0]);
    }
    out << costul_minim;
    return 0;
}