Cod sursa(job #693359)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 27 februarie 2012 11:53:23
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <iostream>

using namespace std;

#define PB push_back
#define MKP make_pair
#define INF 0x3f3f3f3f

int N , M , cost , minim , costt[20][20];
bool muchie[20][20];

int x[20];

bool valid (int k)
{
	for (int i = 1 ; i < k ; ++i)
		for (int j = i + 1 ; j <= k ; ++j)
			if (x[i] == x[j])
				return 0;
	
	return 1;
}


bool ok (int k)
{
	if (!muchie[x[k]][x[1]]) return 0;
	
	cost = costt[x[k]][x[1]];
	
	for (int i = 1 ; i < k ; ++i)
	{
		int nod1 = x[i];
		int nod2 = x[i + 1];
		
		if (!muchie[nod1][nod2])
			return 0;
		
		cost += costt[nod1][nod2];
	}
	
	return 1;
}


void back (int k)
{
	for (int i = 0 ; i < N ; ++i)
	{
		x[k] = i;
		
		if (k == N)
		{
			if (ok (k) && valid (k))
				if (cost < minim)
					minim = cost;
		}
		
		else back (k + 1);
	
	}
}


int main ()
{
	freopen ("hamilton.in" , "r" , stdin);
	freopen ("hamilton.out" , "w" , stdout);
	
	scanf ("%d %d" , &N , &M);
	
	
	int a , b , c;
	
	for (int i = 1 ; i <= M ; ++i)
	{
		scanf ("%d %d %d" , &a , &b , &c);
		
		costt[a][b] = c;
		muchie[a][b] = true;
	}
	
	minim = INF;
	
	back (1);
	
	if (minim != INF)
		printf ("%d" , minim);
	
	else printf ("Nu exista solutie");
	
	return 0;
}