Cod sursa(job #2935454)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 6 noiembrie 2022 19:02:21
Problema Ciclu hamiltonian de cost minim Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <vector>

#define MAXN 18
#define MAXX 18000000
using namespace std;

struct edge{
  int b, cost;
};

struct node{
  vector <edge> neighbours;
};

int dp[MAXN][1 << MAXN];
node graph[MAXN];

void addEdge(int a, int b, int cost) {
  graph[a].neighbours.push_back({b, cost});
}

int main() {
  FILE *fin, *fout;
  fin = fopen("hamilton.in", "r");
  fout = fopen("hamilton.out", "w");

  int n, m, i, a, b, cost, mask, ans;

  fscanf(fin, "%d%d", &n, &m);

  for ( i = 0; i < m; i++ ) {
    fscanf(fin, "%d%d%d", &a, &b, &cost);

    addEdge(a, b, cost);
  }

  for ( mask = 0; mask < (1 << n); mask++ ) {
    for ( i = 0; i < n; i++ ) {
      dp[i][mask] = MAXX + 1;
    }
  }

  for ( edge i : graph[0].neighbours )
    dp[i.b][1 << i.b] = i.cost;

  for ( mask = 0; mask < (1 << n); mask++ ) {
    for ( i = 0; i < n; i++ ) {
      if ( mask & (1 << i) ) {
        for ( edge k : graph[i].neighbours ) {
          if ( mask & (1 << k.b) ) {
            dp[k.b][mask] = min(dp[i][mask], dp[i][mask - (1 << k.b)] + k.cost);
          }
        }
      }
    }
  }

  ans = MAXX + 1;
  for ( i = 0; i < n; i++ ) {
    ans = min(ans, dp[i][(1 << n) - 1]);
  }

  if ( ans != MAXX + 1 ) {
    fprintf(fout, "%d\n", ans);
  } else {
    fprintf(fout, "Nu exista solutie");
  }

  fclose(fin);
  fclose(fout);

  return 0;
}