Cod sursa(job #2209960)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 5 iunie 2018 11:20:05
Problema Ciclu hamiltonian de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

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

struct Edge {
  int v, cost;
};

vector<Edge> neighbours[MAX_N];

int n;

int Backt[MAX_N][1 << MAX_N];

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] = min(Backt[u][visited],
                                       e.cost + backt(e.v, visited ^ (1 << e.v)));
  }
  return Backt[u][visited];
}

int main() {
  int m;
  fin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v, cost;
    fin >> u >> v >> cost;
    neighbours[u].push_back({v,cost});
  }
  int sol = backt(0, 0);
  if (sol != INF)
    fout<<sol<<'\n';
  else fout << "Nu exista solutie" <<'\n';
  return 0;
}