Cod sursa(job #2297758)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 6 decembrie 2018 15:26:40
Problema Ciclu hamiltonian de cost minim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define maxn 18
#define inf INT_MAX / 2

using namespace std;

int ad[maxn+5][maxn+5];
int dp[(1<<maxn)+5][maxn];
int n, m;

int calc ( int conf, int nod )
{
  if ( dp[conf][nod] < inf )
    return dp[conf][nod];

  int i;
  for ( i = 0; i < n; i++ )
    if ( (conf & (1<<i)) && ad[i][nod] < inf )
      dp[conf][nod] = min ( dp[conf][nod], calc (conf-(1<<nod), i) + ad[i][nod] );

  return dp[conf][nod];
}

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

  fin >> n >> m;

  int i, j, a, b, c;
  for ( i = 0; i < n; i++ )
    for ( j = 0; j < n; j++ )
      ad[i][j] = inf;

  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c;
    ad[a][b] = c;
  }

  for ( i = 0; i < (1<<n); i++ )
    for ( j = 0; j < n; j++ )
      dp[i][j] = inf;
  dp[1][0] = 0;

  int _m = inf;
  for ( i = 1; i < n; i++ )
    if ( ad[i][0] < inf )
      _m = min ( _m, calc ((1LL<<n) - 1, i) + ad[i][0] );

  if ( _m < inf )
    fout << _m;
  else
    fout << "Nu exista solutie";

  fin.close ();
  fout.close ();

  return 0;
}