Cod sursa(job #2112828)

Utilizator papinub2Papa Valentin papinub2 Data 23 ianuarie 2018 21:38:33
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 100000000

using namespace std;

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

const int Nmax = 20;
const int Mmax = 262150;

int main()
{
    int n, m, Sol = inf;
    vector<int> A[Nmax];
    vector<vector<int>> C(Mmax, vector<int>(Nmax));
    vector<vector<int>> Cost(Nmax, vector<int>(Nmax));

    in >> n >> m;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            Cost[i][j] = inf;

    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        in >> x >> y >> z;

        A[y].push_back(x);
        Cost[x][y] = z;
    }

    int k = (1<<n);

    for (int i = 0; i < k; i++)
        for (int j = 0; j < n; j++)
            C[i][j] = inf;
    C[1][0] = 0;

    for (int i = 0; i < k; i++)
        for (int j = 0; j < n; j++)
            if (i & (1<<j))
                for (auto w = 0; w < A[j].size(); w++)
                {
                    int nod = A[j][w];

                    if (i & (1<<nod))
                        C[i][j] = min (C[i][j], C[i ^ (1<<j)][nod] + Cost[nod][j]);
                }

    k--;
    for (auto i = 0; i < A[0].size(); i++)
    {
        int nod = A[0][i];
        Sol = min (Sol, C[k][nod] + Cost[nod][0]);
    }

    if (Sol == inf)
        out << "Nu exista solutie";
    else
        out << Sol;

    return 0;
}