Cod sursa(job #687587)

Utilizator Balmus_MaximBalmus Maximilian Balmus_Maxim Data 22 februarie 2012 16:37:03
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#define maxn 1000000000

int n,m,i,a,b,k;
long v[20][20],g[300000][20],j;

int main()
{
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			v[i][j]=-1;
		}
	}
	int n2=1<<n;
	for(i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		scanf("%d",&v[a][b]);
	}
	for(i=1;i<n2;i++){
		for(j=1;j<n;j++){
			g[i][j]=maxn;
		}
	}
	g[1][0]=0;
	for(i=1;i<=n2;i++){
		for(j=0;j<=n;j++){
			if(i!=1 && j==0) continue;
			if(g[i][j]==maxn) continue;
			for(k=0;k<n;k++){
				if(!(i&(1<<k)) && v[j][k]>0){
					if(g[i][j]+v[j][k]<g[i^(1<<k)][k] && v[j][k]>0){
						g[i^(1<<k)][k]=g[i][j]+v[j][k];
					}
				}
			}
		}
	}
	long sol=maxn;
	for(i=1;i<n;i++){
		if(sol>g[n2-1][i]+v[i][0] && v[i][0]>0){
			sol=g[n2-1][i]+v[i][0];
		}
	}
	if(sol!=maxn){
		printf("%ld",sol);
	}else{
		printf("Nu exista solutie");
	}
	return 0;
}