Cod sursa(job #902592)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 1 martie 2013 15:19:05
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

#define inf 200000000
#define Nmax 20
#define Max 262150

int cost[Nmax][Nmax], c[Max][Nmax];
vector < list<int> > vecini;
list <int>::iterator it;

int n, m, sol;

void citire(){
    int x, y, cc;
    scanf("%i %i", &n, &m);

    vecini.resize(n+1);

    for(register int i = 0; i < Nmax; ++i)
        for(register int j = 0; j < Nmax; ++j)
            cost[i][j] = inf;
    for(register int i = 0; i < Max; ++i)
        for(register int j = 0; j < Nmax; ++j)
            c[i][j] = inf;

    for(int i = 1; i <= m; ++i){
        scanf("%i %i %i", &x, &y, &cc);
        cost[x][y] = cc;
        vecini[y].push_back(x);
    }
    fclose(stdin);
}

void hamilton(){
    c[1][0] = 0;

    for(register int i = 0; i < 1 << n; ++i)
        for(register int j = 0; j < n; ++j)
            if(i & 1 << j)
                for(it = vecini[j].begin(); it != vecini[j].end(); ++it)
                    if(i & 1 << *it)
                        c[i][j] = min(c[i][j], c[i ^ (1 << j)][*it] + cost[*it][j]);
    sol = inf;
    for(it = vecini[0].begin(); it != vecini[0].end(); ++it)
        sol = min(sol, c[(1 << n) - 1][*it] + cost[*it][0]);
    if(sol == inf) printf("Nu exista solutie\n");
        else printf("%i\n", sol);
}

int main(){
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);

    citire();
    hamilton();
}