Cod sursa(job #2981971)

Utilizator alexandru.morusAlexandru Morus alexandru.morus Data 19 februarie 2023 12:37:12
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
///Alexandru Morus
#include <bits/stdc++.h>

using namespace std;

ifstream  in("hamilton.in");
ofstream out ("hamilton.out");
long long mt[1 << 19][30];
vector <pair <long long, long long>> g[30];
long long vf[30];
int main ()
{
    long long i,n,m,a,b,c,masca,afs,j;
    in >> n >> m;
    for(i = 1; i < (1 << n); i ++)
    {
        for(j = 0; j <= n; j ++)
        {
            mt[i][j] = 99999999;
        }
    }
    for(i = 1; i <= m; i ++)
    {
        in >> a >> b >> c;
        g[b].push_back(make_pair(a,c));
        if(b == 0)
        {
            vf[a] = c;
        }
    }
    mt[1][0] = 0;
    for(masca = 3; masca < (1 << n); masca += 2)
    {
        for(i = 1; i < n; i ++)
        {
            if(masca & (1 << i))
            {
                for(auto j : g[i])
                {
                    mt[masca][i] = min(mt[masca][i],mt[masca ^ (1 << i)][j.first] + j.second);
                }
            }
        }
    }
    afs = 99999999;
    for(i = 1; i < n; i ++)
    {
        if(vf[i])
        {
            afs = min(afs, mt[(1 << n) - 1][i] + vf[i]);
        }
    }
    if(afs == 99999999)
    {
        out << "Nu exista solutie";
        return 0;
    }
    out << afs;
    return 0;
}