Cod sursa(job #1756771)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 13 septembrie 2016 17:08:27
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
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[MaskMax][Nmax];
vector < int > G[Nmax];

int Dinamica( int nod, int mask ){

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

    vector < int > :: iterator it;
    for( it = G[nod].begin(); it != G[nod].end(); ++it )
        if( ( 1 << *it ) & mask ){
            if( *it == 0 && ( mask^(1<<nod)) != 1 ) continue;
            D[mask][nod] = min( D[mask][nod], Dinamica( *it, mask^(1<<nod) ) + Cost[*it][nod] );
        }

    return D[mask][nod];
}

int main(){

    fin >> N >> M;

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

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

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

    int Sol = inf;

    vector < int > :: iterator it;

    for( it = G[0].begin(); it != G[0].end(); ++ it )
        Sol = min( Sol, Dinamica( *it, FullMask ) + Cost[*it][0] );

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

    return 0;
}