Cod sursa(job #1096784)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 2 februarie 2014 16:38:41
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#include<vector>

using namespace std;

#define inf 100000000
#define max_n 19

ifstream f("hamilton.in");
ofstream g("hamilton.out");

int n , x , y , m;
int C[max_n][max_n] , D[1<<max_n][max_n];
vector<int> L[max_n];

void read(){
	
	f>>n>>m;
	
	for( int i = 1 ; i <= m ; i++ ){
		f>>x>>y;
		L[y].push_back(x);
		f>>C[x][y];
	}
	
}

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

void solve(){
	
	int i , j;
	unsigned int k;
	
	for( i = 1 ; i < (1<<n) ; i++ )
		for( j = 0 ; j < n ; j++ )
			if( i & (1<<j) )
				for( k = 0 ; k < L[j].size() ; k++ )
					if( i & (1<<L[j][k]) )
						D[i][j] = minim( D[i][j] , D[i^(1<<j)][L[j][k]] + C[L[j][k]][j] );
	
	
}

void init(){
	
	int i , j;
	
	for( i = 1 ; i < (1<<n) ; i++ )
		for( j = 0 ; j < n ; j++ )
			D[i][j] = inf;
	
	D[1][0] = 0;
}

void print(){
	
	int sol = inf;
	
	for( int i = 0 ; i < n ; i++ )
		if( C[i][0] != 0 )
			sol = minim( sol , D[(1<<n) - 1][i] + C[i][0] );
	
	if( sol == inf ){
		g<<"Nu exista solutie\n";
		return;
	}
	g<<sol<<"\n";
}

int main(){
	
	read();
	
	init();
	
	solve();
	
	print();
	
	return 0;
}