Cod sursa(job #2341558)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 11 februarie 2019 22:32:36
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define INF 0x3f3f3f3f
#define Nmax 19

using namespace std;

ifstream f("hamilton.in");
ofstream g("hamilton.out");

int n, m, x, y, c;
int ans=INF;
int a[Nmax][Nmax];
int ham[(1<<Nmax)+5][Nmax];
vector <int> v[Nmax];

int main()
{
    f >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        f >> x >> y >> c;
        a[x][y]=c;
        v[x].push_back(y);
    }

    memset(ham, INF, sizeof(ham));


    for (int i = 0; i < n; i++)
        ham[0][i]=ham[1][i]=0;

    int p = (1<<n);
    for (int st=0; st < p; st++)
        for (int i = 0; i < n; i++)
            if(st&&(1<<i))
            {
                for (auto it:v[i])
                    ham[st][i]=min(ham[st][i], ham[st^(1<<i)][it]+a[it][i]);
            }
    for (int i = 1; i < n; i++)
        if(a[0][i] != 0) ans=min(ans, ham[p-1][i]+a[0][i]);

    if(ans==INF) g << "Nu exista solutie";
    else g << ans;

    return 0;
}