Cod sursa(job #3237702)

Utilizator tsg38Tsg Tsg tsg38 Data 11 iulie 2024 22:32:02
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

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

const int DIM = 18;
const int INF = 2e9;

int cost[DIM][DIM];

int main() {
  ios_base::sync_with_stdio(0);
  fin.tie(0);
  int n, m, u, v, c;

  fin >> n >> m;
  while ( m-- ) {
	fin >> u >> v >> c;
	cost[u][v] = c;
  }
  vector<vector<int>> dp((1 << n), vector<int>(n, INF));
  dp[1][0] = 0;
  for ( int mask = 1; mask < (1 << n); ++mask ) {
	if ( (mask & 1) == 0 ) continue;
	for ( int i = 0; i < n; ++i ) {
	  for ( int j = 0; j < n; ++j ) {
        if ( (mask & (1 << j)) == 0 && cost[i][j] ) {
		  dp[mask ^ (1 << j)][j] = min(dp[mask ^ (1 << j)][j], dp[mask][i] + cost[i][j]);
		}
	  }
	}
  }
  int res = INF;
  for ( int i = 0; i < n; ++i ) {
	if ( cost[i][0] ) {
	  res = min(res, dp[(1 << n) - 1][i] + cost[i][0]);
    }
  }
  if ( res == INF ) {
	fout << "Nu exista solutie";
  } else {
	fout << res;
  }
  fin.close();
  fout.close();
  return 0;
}