Cod sursa(job #2126950)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 10 februarie 2018 10:35:11
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;
int n,m,a,b,c;
const int INF = 0x3f3f3f3f;
vector <int> g[18];
int d[18][1<<18];
int ct[18][18];
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    scanf("%d %d", &n,&m);
    for(int i=0;i<m;++i)
    {
        scanf("\n%d %d %d", &a, &b,&c);
        ct[a][b]=c;
        g[b].push_back(a);
    }
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<(1<<n);++j)
            d[i][j]=INF;
    }
    d[0][1]=0;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<(1<<n);++j)
        {
            if(j && (1<<i))
            {
                for(int k:g[i])
                {
                    if(j && (1<<k))
                    {
                        d[i][j]=min(d[i][j], d[k][j^(1<<i)]+ct[k][i]);
                    }
                }
            }
        }
    }
    int rez=INF;
    for(int i:g[0])
    {
        rez=min(rez,d[i][(1<<n)-1]+ct[i][0]);
    }
    if(rez!=INF)
        cout<<rez;
    else
        cout<<"Nu exista solutie";
    return 0;
}