Cod sursa(job #2306602)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 22 decembrie 2018 17:03:29
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include<cstdio>
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];
    v==1<<30?printf("Nu exista solutie"):printf("%d",v);
}