Cod sursa(job #2716740)

Utilizator MihneaCadar101Cadar Mihnea MihneaCadar101 Data 5 martie 2021 16:47:41
Problema Ciclu hamiltonian de cost minim Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
#define nr 1000000001
int n, m, cost[20][20], dp[1 << 19][19];
vector <int> V[20];

int main()
{
    fin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cost[i][j] = nr;
        }
    }

    for (int i = 1; i <= m; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        cost[x][y] = c;
        V[y].push_back(x);
    }

    for (int i = 0; i < (1 << n); ++i) {
        for (int j = 0; j < n; ++j) {
            dp[i][j] = nr;
        }
    }

    dp[1][0] = 0;
    int mini = INT_MAX;
    for (int mask = 1; mask < (1 << n); ++mask) {
        for (int i = 0; i < n; ++i) {
            if (mask & (1 << i)) {
                for (vector <int> :: iterator it = V[i].begin(); it != V[i].end(); ++it) {
                    if (mask & (1 << *it)) {
                        dp[mask][i] = min(dp[mask][i], dp[mask ^ (1 << i)][*it] + cost[*it][i]);
                    }
                }
            }
        }
    }

    int mask = (1 << n) - 1, ans = INT_MAX;
    for (vector <int> :: iterator it = V[0].begin(); it != V[0].end(); ++it) {
        ans = min(ans, dp[mask][*it] + cost[*it][0]);
    }

    if (ans == INT_MAX)
        fout << "Nu exista solutie";
    else
        fout << ans;
    return 0;
}