Cod sursa(job #2935370)

Utilizator Ana_22Ana Petcu Ana_22 Data 6 noiembrie 2022 16:59:04
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <vector>
#define NMAX 18
#define B2MAX ( 1 << NMAX )
#define NUL 20000000

using namespace std;

int cost[NMAX][NMAX];
int dp[B2MAX][NMAX];
vector <int> graf[NMAX];

int main() {
    FILE *fin, *fout;
    int n, m, i, j, a, b, cnt, rez;
    fin = fopen( "hamilton.in", "r" );
    fout = fopen( "hamilton.out", "w" );
    fscanf( fin, "%d%d", &n, &m );
    for( i = 0; i < n; i++ )
      for( j = 0; j < n; j++ )
        cost[i][j] = NUL;
    for( i = 0; i < ( 1 << n ); i++ )
      for( j = 0; j < n; j++ )
        dp[i][j] = NUL;
    for( i = 0; i < m; i++ ) {
      fscanf( fin, "%d%d", &a, &b );
      graf[a].push_back(b);
      fscanf( fin, "%d", &cost[a][b] );
    }
    dp[1][0] = 0;
    for( i = 0; i < ( 1 << n ); i++ ) {
      for( j = 0; j < n; j++ ) {
        if( i & ( 1 << j ) ) {
          for( cnt = 0; cnt < graf[j].size(); cnt++ )
            dp[i][graf[j][cnt]] = min( dp[i^(1<<graf[j][cnt])][j] + cost[j][graf[j][cnt]], dp[i][graf[j][cnt]] );
        }
      }
    }
    rez = NUL;
    for( i = 0; i < n; i++ )
      if( rez > dp[(1<<n)-1][i] + cost[i][0] )
      rez = dp[(1<<n)-1][i] + cost[i][0];
    if( rez == NUL )
      fprintf( fout, "Nu exista solutie" );
    else
      fprintf( fout, "%d", rez );
    fclose( fin );
    fclose( fout );
    return 0;
}