Cod sursa(job #1472449)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 17 august 2015 07:17:41
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
int i,j,d,k,v,n,m,a,b,r,p,t,c[262145][19],w[19][19],u[19];
int main() {
	freopen("hamilton.in","r",stdin),freopen("hamilton.out","w",stdout),scanf("%d%d",&n,&m);
	while(m--)
    	scanf("%d%d%d",&a,&b,&d),w[a][b]=d;
	for(j=0;j<(1<<n);j++) {
		for(i=0;i<n;i++)
			c[j][i]=(j!=(1<<i))?(1<<30):0;
       	for(i=t=0,k=j;k;k>>=1,i++)
       	if(k&1)
            u[t++]=i;
       	for(r=0;r<t;r++)
       	if(u[r]) {
            for(v=1<<30,p=0;p<t;p++)
            if(w[u[p]][u[r]]&&v>w[u[p]][u[r]]+c[j^(1<<u[r])][u[p]])
                v=w[u[p]][u[r]]+c[j^(1<<u[r])][u[p]];
            c[j][u[r]]=v;
		}
	}
	for(v=1<<30,j=0;j<n;j++)
	if(w[j][0]&&v>c[(1<<n)-1][j]+w[j][0])
    	v=c[(1<<n)-1][j]+w[j][0];
	if(v==1<<30)
    	printf("Nu exista solutie");
	else
      	printf("%d",v);
}