Cod sursa(job #2216219)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 25 iunie 2018 22:40:21
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int MAXN = 18;
const int MAXM = 306;
const int MAXVAL = 1e6;
const int INF = MAXVAL * MAXM + 1;

vector<int> g[MAXN];
int n, m;
int c[MAXN][MAXN];
int dp[1 << MAXN][MAXN];

int main() {
  in >> n >> m;

  for (int i = 1; i <= m; ++ i) {
    int a, b;
    in >> a >> b;
    g[b].push_back(a);
    in >> c[a][b];
  }

  for (int i = 0; i < 1 << n; ++ i) for (int j = 0; j < n; ++ j) dp[i][j] = INF;
  for (int i = 0; i < n; ++ i) for (int j = 0; j < n; ++ j) if (c[i][j] == 0) c[i][j] = INF;

  dp[1][0] = 0;
  for (int i = 0; i < (1 << n); ++ i) {
    for (int j = 0; j < n; ++ j) {
      if (i & (1 << j)) {
        for (auto x : g[j]) {
          if (i & (1 << x))
            dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][x] + c[x][j]);
        }
      }
    }
  }

  int sol = INF;
  for (int i = 0; i < n; ++ i) {
    sol = min(sol, dp[(1 << n) - 1][i] + c[i][0]);
  }

  if (sol == INF) out << "Nu exista solutie";
  else out << sol;

  return 0;
}