Cod sursa(job #382668)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 14 ianuarie 2010 12:52:04
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <cstring>

#define file_in "hamilton.in"
#define file_out "hamilton.out"

#define Nmax 1000

int a,b,c,n,m,cmax,p[100],q[100][100],viz[1000];

void back(int k)
{
	
	if (k>n)
	{
		//for (int i=1;i<=n;++i)
			// printf("%d " ,p[i]);
		int cost=0,nr=0;
		cost+=q[p[n]][p[1]];
		for (int j=1;j<n;++j)
		{
			cost+=q[p[j]][p[j+1]];
		}
		//printf("%d\n", cost);
	    if (cost<cmax && cost>0) cmax=cost;
	}
	else
		for (int i=1;i<=n;++i)
		if (!viz[i])
		{
			viz[i]=1;
			p[k]=i;
			back(k+1);
			viz[i]=0;
		}
}
				 

int main()
{
	int i,j;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	for (i=1;i<=n;++i)
		 for (j=1;j<=n;++j)
			  q[i][j]=0x3f3f3f3f;
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d", &a, &b, &c);
		a++;
		b++;
		q[a][b]=c;
	}
	
	/*for (i=1;i<=n;++i)
	{
		for (j=1;j<=n;++j)
			 printf("%d ", q[i][j]);
		printf("\n");
	}*/
	
	cmax=0x3f3f3f3f;
	
	back(1);
	
	if (cmax==0x3f3f3f3f) printf("Nu exista solutie");
	else
	printf("%d", cmax);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}