Cod sursa(job #2209425)

Utilizator bogdi1bogdan bancuta bogdi1 Data 3 iunie 2018 13:12:55
Problema Ciclu hamiltonian de cost minim Scor 85
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <vector>
#include <algorithm>

const int MAX_N = 18;
const int INF = 2000000000;

struct Edge {
  int v, cost;
};

std::vector<Edge> neighbours[MAX_N];

int n;

int Backt[MAX_N][262144];

int backt(int u, int visited) {
  if (Backt[u][visited] == 0) {
    Backt[u][visited] = INF;
    if (visited == (1 << n) - 1 && u == 0)
      Backt[u][visited] = 0;
    else
      for (Edge e : neighbours[u])
        if ((visited & (1 << e.v)) == 0) // !visited[e.v]
                                         // ((visited >> e.v) & 1) == 0
          Backt[u][visited] = std::min(Backt[u][visited],
                                       e.cost + backt(e.v, visited ^ (1 << e.v)));
  }
  return Backt[u][visited];
}

int main() {
  freopen("hamilton.in", "r",stdin);
  freopen("hamilton.out", "w",stdout);
  int m,r;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v, cost;
    scanf("%d%d%d", &u, &v, &cost);
    neighbours[u].push_back({v,cost});
  }
  r=backt(0, 0);
  if(r==INF)
    printf("Nu exista solutie");
  else
    printf("%d\n", r);
  return 0;
}