Cod sursa(job #935170)

Utilizator IoannaPandele Ioana Ioanna Data 1 aprilie 2013 23:06:37
Problema Ciclu hamiltonian de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define NMAX 19
#define LMAX (1<<18)+1
#define INF 2000000000
using namespace std;

int n,m;
int c[NMAX][LMAX];
vector <int> v[NMAX];
int cost[NMAX][NMAX];

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

void read() {
  int a,b,c;
  in>>n>>m;
  for (int i = 0; i < m; ++i) {
    in>>a>>b>>c;
    v[b].push_back(a);
    cost[b][a] = c;
  }
}

void init()
{
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < (1<<n); ++j)
      c[i][j] = INF;
}

void solve()
{
  int dim,nod;
  init();
  c[0][1] = 0;
  for (int j = 1; j < (1<<n); ++j)
    for (int i = 0; i < n; ++i)
      if (j & (1<<i)) {
        dim = v[i].size();
        for (int k = 0; k < dim; ++k) {
          nod = v[i][k];
          if (j & (1<<nod)) {
              c[i][j] = min(c[i][j], c[nod][j ^ (1<<i)] + cost[i][nod]);
          }
        }
      }
  int solutie = INF;

  dim = v[0].size();
  for (int i = 0; i < dim; ++i) {
      solutie = min(solutie, c[v[0][i]][(1<<n)-1] + cost[0][v[0][i]]);
    }

  if (solutie == INF) {
    out<<"Nu exista solutie\n";
  } else {
    out<<solutie<<"\n";
  }
}

int main() {
  read();
  solve();
  return 0;
}