Cod sursa(job #2297752)

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

using namespace std;

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

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

  int i, j;
  for ( i = 0; i < n; i++ )
    if ( (conf & (1LL<<i)) && ad[j][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;
  }

  lll il;
  for ( il = 0; il < (1LL<<n); il++ )
    for ( i = 0; i < n; i++ )
      dp[il][i] = inf;
  for ( i = 0; i < n; i++ )
    dp[1LL<<i][i] = 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;
}