Cod sursa(job #2364237)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 3 martie 2019 22:51:02
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
#define INFINIT 110000000

int d[1 << 18][18], cost[18][18];

int mn( int a, int b ) {
    return a < b ? a : b;
}

int main() {
    FILE *fin, *fout;
    int n, m, a, b, c, i, j, ii, k, s = INFINIT;
    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++ )
            if ( i != j )
                cost[i][j] = INFINIT;
    for ( i = 0; i < ( 1 << 18 ); i++ )
        for ( j = 0; j < n; j++ )
            d[i][j] = INFINIT;
    for ( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d%d", &a, &b, &c );
        cost[a][b] = c;
    }
    d[1][0] = 0;
    for ( i = 3; i < ( 1 << n ); i += 2 ) {
        for  ( j = 0; j < n; j++ ) {
            if ( i & ( 1 << j ) ) {
                ii = i ^ ( 1 << j );
                for ( k = 0; k < n; k++ ) {
                    if ( ( ii & ( 1 << k ) ) && k != j )
                        d[i][j] = mn( d[i][j], d[ii][k] + cost[k][j] );
                }
            }
        }
    }
    for ( i = 0; i < n; i++ )
        s = mn( s, d[( 1 << n ) - 1][i] + cost[i][0] );
    if ( s >= INFINIT )
        fprintf( fout, "Nu exista solutie" );
    else
        fprintf( fout, "%d", s );
    fclose( fin );
    fclose( fout );
    return 0;
}