Cod sursa(job #2478250)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 21 octombrie 2019 20:03:09
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>
#include <vector>
using namespace std;
const int INF = 2.e9;
vector <int> G[25];
int cost[25][25] , c[262150][25];
int main()
{
    freopen("hamilton.in" , "r" , stdin);
    freopen("hamilton.out" , "w" , stdout);
    int n , m , u , v , i , j , p , lim , k , cmin;
    scanf("%d%d" , &n , &m);
    for(i = 0 ; i < n ; i ++)
        for(j = 0 ; j < n ; j ++)
            cost[i][j] = INF;
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d%d%d" , &u , &v , &p);
        cost[u][v] = p;
        G[v].push_back(u);
    }
    lim = (1 << n) - 1;
    for(i = 0 ; i <= lim ; i ++)
        for(j = 0 ; j < n ; j ++)
            c[i][j] = INF;
    c[1][0] = 0;
    for(i = 0 ; i <= lim ; i ++)
        for(j = 0 ; j < n ; j ++)
            if(i & (1 << j))
                for(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]);
    cmin = INF;
    for(j = 0 ; j < G[0].size() ; j ++)
        cmin = min(cmin , c[lim][G[0][j]] + cost[G[0][j]][0]);
    if(cmin == INF)
        printf("Nu exista solutie\n");
    else
        printf("%d\n" , cmin);
    return 0;
}