Cod sursa(job #2305629)

Utilizator papinub2Papa Valentin papinub2 Data 20 decembrie 2018 18:16:37
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define inf 180000005

using namespace std;

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

const int Nmax = 20;
const int Vmax = 262150;

vector<int> A[Nmax];

int main()
{
    int n, m, k, rez = inf;
    in >> n >> m;

    k = (1<<n);
    vector<vector<int> > dp(Vmax, vector<int>(n + 1));
    vector<vector<int> > cost(n + 1, vector<int>(n + 1));

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

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

        A[y].push_back(x);
        cost[x][y] = c;
    }

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

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

    k--;
    for (auto i = 0; i < A[0].size(); i++)
    {
        int nod = A[0][i];
        rez = min(rez, dp[k][nod] + cost[nod][0]);
    }

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

    return 0;
}