Cod sursa(job #1244213)

Utilizator diana97Diana Ghinea diana97 Data 16 octombrie 2014 21:42:30
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 18 + 1 + 1;
const int INF = 0X3fffffff;

int n, m;
int cost[NMAX][NMAX];
int best[1 << NMAX][NMAX];

void citeste() {
    int a, b, c;
    f >> n >> m;
    for (int i = 1; i <= m; i++) {
        f >> a >> b >> c;
        a++; b++;
        cost[a][b] = c;
    }
}

int hamilton(int nod, int configuratie) {
    if (best[configuratie][nod] != 0) return best[configuratie][nod];
    if (configuratie == (1 << (n + 1)) - 2) {
        if (cost[nod][1] == 0) best[configuratie][nod] = INF;
        else best[configuratie][nod] = cost[nod][1];
    }
    else {
        int crt, minim = INF;
        for (int i = 1; i <= n; i++)
            if (cost[nod][i] && (configuratie & (1 << i)) == 0) {
                crt = cost[nod][i] + hamilton(i, configuratie | (1 << i));
                minim = min(crt, minim);
            }
        best[configuratie][nod] = minim;
    }
    return best[configuratie][nod];
}

int main() {
    citeste();
    int c = hamilton(1, 1 << 1);
    if (c == INF) g << "Nu exista solutie";
    else g << c;
    g << '\n';
    return 0;
}