Cod sursa(job #2817883)

Utilizator ElizaTElla Rose ElizaT Data 14 decembrie 2021 14:57:45
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 18,INF = 2e9;
int cost[NMAX + 5][NMAX + 5],dp[(1 << NMAX) + 5][NMAX + 5];
vector <int> edge[NMAX + 5];

int main()
{
    ifstream fin("hamilton.in");
    ofstream fout("hamilton.out");
    int n,m,a,b,c,ans = INF;
    fin >> n >> m;
    for (int i = 0;i < n;i++)
        for (int j = 0;j < n;j++)
            cost[i][j] = INF;
    for (int i = 0;i < (1 << n);i++)
        for (int j = 0;j < n;j++)
            dp[i][j] = INF;
    for (int i = 0;i < m;i++) {
        fin >> a >> b >> c;
        cost[a][b] = c;
        edge[b].push_back(a);
    }
    dp[1][0] = 0;
    for (int i = 0;i < (1 << n);i++) {
        for (int j = 0;j < n;j++) {
                if ((i & (1 << j))) {
                    for (int k = 0;k < edge[j].size();k++)
                        if ((i & (1 << edge[j][k])))
                            dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][edge[j][k]] + cost[edge[j][k]][j]);
                }
        }
    }
    for (int i = 0;i < edge[0].size();i++)
        ans = min(ans, dp[(1 << n) - 1][edge[0][i]] + cost[edge[0][i]][0]);
    if (ans == INF)
        fout << "Nu exista solutie";
    else
        fout << ans;
    return 0;
}