Cod sursa(job #1456673)

Utilizator Burbon13Burbon13 Burbon13 Data 1 iulie 2015 17:07:09
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#define inf 0x3f3f3f3f
#define maxx 263000
#define nmx 20
using namespace std;

int n, m;
int cost[nmx][nmx];
int c[maxx][nmx];
vector <int> g[nmx];

int calc(const int conf, const int nod) {
    if(c[conf][nod] == -1) {
        c[conf][nod] = inf;
        for(size_t i = 0; i < g[nod].size(); ++i)
            if(conf & (1 << g[nod][i])) {
                if(g[nod][i] == 0 && conf != (1<<nod)+1)
                    continue;
                c[conf][nod] = min(c[conf][nod], calc(conf^(1<<nod),g[nod][i]) + cost[g[nod][i]][nod]);
            }
    }
    return c[conf][nod];
}

int main() {
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    memset(c, -1, sizeof(c));
    c[1][0] = 0;
    memset(cost, inf, sizeof(cost));
    scanf("%d %d", &n, &m);
    for(; m; --m) {
        int n1, n2, C;
        scanf("%d %d %d", &n1, &n2, &C);
        g[n2].push_back(n1);
        cost[n1][n2] = C;
    }
    int sol = inf;
    for(size_t i = 0; i < g[0].size(); ++i)
        sol = min(sol,calc((1 << n) - 1, g[0][i]) + cost[g[0][i]][0]);
    if(sol == inf)
        printf("Nu exista solutie!\n");
    else
        printf("%d\n", sol);
    return 0;
}