Cod sursa(job #3297383)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 15:57:38
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>

#include <vector>
#include <algorithm>

constexpr int INF = 1e9;

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

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

  std::vector<std::vector<int>> adj(n, std::vector<int>(n, +INF));
  for( int i = 0; i < m; i++ ){
    int a, b, cost;
    fscanf( fin, "%d%d%d", &a, &b, &cost );
    adj[a][b] = std::min( adj[a][b], cost );
    // adj[b][a] = std::min( adj[b][a], cost );
  }

  int p2 = (1 << n);
  std::vector<std::vector<int>> dp(p2, std::vector<int>(n, +INF));
  for( int i = 0; i < n; i++ )
    dp[1 << i][i] = adj[0][i];

  for( int mask = 0; mask < p2; mask++ )
    for( int last = 0; last < n; last++ )
      if( (mask & (1 << last)) )
        for( int next = 0; next < n; next++ )
          if( !(mask & (1 << next)) ){
            int mask2 = mask | (1 << next);
            dp[mask2][next] = std::min( dp[mask2][next], dp[mask][last] + adj[last][next] );
          }

  fprintf( fout, "%d\n", dp[p2 - 1][0] );

  fclose( fin );
  fclose( fout );
  return 0;
}