Cod sursa(job #1454193)

Utilizator Burbon13Burbon13 Burbon13 Data 25 iunie 2015 18:01:21
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define inf 0x3f3f3f3f
#define maxn 20
#define maxx 262200
using namespace std;

int n, m, sol = inf;
int cost[maxn][maxn];
int c[maxx][maxn];
vector <int> g[maxn];

int main(){
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    memset(cost, inf, sizeof(cost));
    scanf("%d %d", &n, &m);
    for(; m; --m){
        int nod1, nod2;
        scanf("%d %d", &nod1, &nod2);
        scanf("%d", &cost[nod1][nod2]);
        g[nod2].push_back(nod1);
    }
    for(int i = 0; i < 1 << n; ++i)
        for(int j = 0; j < n; ++j)
            c[i][j] = inf;
    c[1][0] = 0;
    for(int i = 0; i < 1 << n; ++i)
        for(int j = 0; j < n; ++j)
           if(i & (1 << j))
              for(unsigned int k = 0; k < g[j].size(); ++k)
                  if(i & (1 << g[j][k]))
                      c[i][j] = min(c[i][j], c[i ^ (1 << j)][g[j][k]] + cost[g[j][k]][j]);
    for(unsigned int i = 0; i < g[0].size(); ++i)
        sol = min(sol, c[(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;
}