Cod sursa(job #1756759)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 13 septembrie 2016 16:41:09
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

#define Nmax 20
#define MaskMax 131075
#define inf 0x3f3f3f3f

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

int N, M;

int Cost[Nmax][Nmax], D[Nmax][MaskMax];

int Dinamica( int nod, int mask, int level ){

    if( D[nod][mask] != inf )
        return D[nod][mask];

    for( int i = 0; i < N; ++i )
        if( Cost[i][nod] && ( ( 1 << i ) & mask ) ){
            if( nod == 0 && ( mask^(1<<nod)) != 0 ) continue;
            D[nod][mask] = min( D[nod][mask], Dinamica( i, mask^(1<<nod), level+1 ) + Cost[i][nod] );
        }

    return D[nod][mask];
}

int main(){

    fin >> N >> M;

    memset( D, inf, sizeof(D) );

    int x, y;
    while( M-- ){
        fin >> x >> y;
        fin >> Cost[x][y];
    }

    int FullMask = (1 << N) - 1;
    for( int i = 0; i < N; ++i )
        D[i][1<<i] = 0;

    int Sol = inf;

    for( int i = 0; i < N; ++i )
        if( Cost[i][0] )
            Sol = min( Sol, Dinamica( i, FullMask, 0 ) + Cost[i][0] );

    if( Sol == inf )
        fout << "Nu exista solutie";
    else
        fout << Sol;

    return 0;
}