Cod sursa(job #3314333)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 9 octombrie 2025 15:49:32
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;

int main() {
#ifndef LOCAL
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  freopen("hamilton.in", "r", stdin);
  freopen("hamilton.out", "w", stdout);
#endif
  size_t N;
  size_t M;
  cin >> N >> M;
  vector<vector<pair<int, int>>> G(N);
  for (; M--;) {
    int u;
    int v;
    int c;
    cin >> u >> v >> c;
    G[v].emplace_back(c, u);
  }
  vector<vector<int>> D(1 << 18, vector<int>(N, INT_MAX));
  D[1][0] = 0;
  for (size_t q = 1; q < (1 << N); ++q) {
    for (size_t v = 0; v < N; ++v) {
      if ((q >> v) & 1) {
        for (auto const& [c, u] : G[v]) {
          if (((q >> u) & 1)) {
            if (D[q ^ (1 << v)][u] != INT_MAX)
              D[q][v] = min(D[q][v], D[q ^ (1 << v)][u] + c);
          }
        }
      }
    }
  }
  int x = INT_MAX;
  for (auto const& [c, u] : G[0]) {
    if (D[(1 << N) - 1][u] != INT_MAX) {
      x = min(x, D[(1 << N) - 1][u] + c);
    }
  }
  if (x == INT_MAX) {
    cout << "Nu exista solutie";
  } else {
    cout << x;
  }
  cout << '\n';
  return 0;
}