Cod sursa(job #2079868)

Utilizator netfreeAndrei Muntean netfree Data 1 decembrie 2017 21:58:16
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

int n, src;

const int N_MAX = 18 + 5;
const int inf = 0x3f3f3f3f;

int graph[N_MAX][N_MAX], dp[600000 + 5][N_MAX], m;

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

void init() {
	for ( int i = 0; i < n; ++i )
        if(graph[src][i] != inf)
            dp[ 1 << i ][ i ] = graph[ src ][ i ];
}

int solve( int mask, int nod ) {

	if ( dp[mask][nod] != -1 )
		return dp[mask][nod];

	dp[mask][nod] = inf;

	for ( int i = 0; i < n; ++i )
		if ( i != nod && ( mask & ( 1 << i ) ) )
			dp[mask][nod] = min( dp[mask][nod], solve( mask - (1 << nod), i ) + graph[i][nod] );

	return dp[mask][nod];
}

int main() {

    fin >> n >> m;

    memset(graph, inf, sizeof(graph));

	while(m--){
        int a, b, c;
        fin >> a >> b >> c;
        graph[a][b] = c;
	}

	for(int i = 0; i<n; ++i)
        graph[i][i] = 0;

    src = 0;

	memset(dp, -1, sizeof(dp));

	init();

	int ans  = solve((1<<n)-1, src);

	if(ans >= 0 and ans < inf)
        fout << ans;
    else
        fout << "Nu exista solutie";


	return 0;
}