Cod sursa(job #2444516)

Utilizator DavidLDavid Lauran DavidL Data 31 iulie 2019 17:30:34
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("hamilton.in");
ofstream fo("hamilton.out");

const int INF = 1e8;

int n, m;
int C[20][20];
int dp[20][(1 << 18)];

int getDp(int nod, int mask)
{
    if (dp[nod][mask])
        return dp[nod][mask];

    if (mask == (1 << n) - 1)
    {
        if (C[nod][1])
            dp[nod][mask] = C[nod][1];
        else
            dp[nod][mask] = INF;
        return dp[nod][mask];
    }

    dp[nod][mask] = INF;
    for (int i = 1; i <= n; i++)
    {
        if (C[nod][i] && (mask & (1 << (i - 1))) == 0)
        {
            dp[nod][mask] = min(dp[nod][mask], C[nod][i] + getDp(i, (mask | (1 << (i - 1)))));
        }
    }

    return dp[nod][mask];
}

int main()
{
    fi >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int u, v, c;
        fi >> u >> v >> c;
        u++; v++;
        C[u][v] = c;
    }

    int val = getDp(1, 1);

    if (val == INF)
        fo << "Nu exista solutie";
    else
        fo << val;

    return 0;
}