Cod sursa(job #1226477)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 5 septembrie 2014 17:12:39
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <vector>
#define node first
#define cost second
using namespace std;

const int NMAX = 19, INFI = 2e9;

vector <pair <int, int> > G[NMAX];
int D[1 << NMAX][NMAX];

int main () {

    freopen ("hamilton.in", "r", stdin);
    freopen ("hamilton.out", "w", stdout);
    vector <pair <int, int> > :: iterator k;
    int N, M, a, b, c, l, i, j, ans = INFI;
    scanf ("%d%d", &N, &M);
    while (M--) {
        scanf ("%d%d%d", &a, &b, &c);
        G[b].push_back (make_pair (a, c));
    }
    l = 1 << N;
    for (i = 3; i < l; i += 2) {
        D[i][0] = INFI;
        for (j = 1; j < N; ++j) {
            D[i][j] = INFI;
            if (i & (1 << j))
                for (k = G[j].begin (); k != G[j].end (); ++k)
                    if (i & (1 << k->node))
                        D[i][j] = min (D[i][j], D[i ^ (1 << j)][k->node] + k->cost);
        }
    }
    for (k = G[0].begin (); k != G[0].end (); ++k)
        ans = min (ans, D[l - 1][k->node] + k->cost);
    if (ans >= INFI)
        printf ("Nu exista solutie");
    else
        printf ("%d", ans);

}