Cod sursa(job #2232970)

Utilizator shantih1Alex S Hill shantih1 Data 21 august 2018 19:08:43
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#define zeros(x) (x^(x-1))&x

using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

int n,m,a,c1,c2,i,j,l,k,nr,rez,inf;
int cm[20][20], v[20];

int main() {
	
	fin>>n>>m;
	inf=(1<<29);
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cm[i][j]=inf;
	
	while(m--)
	{
		fin>>a>>k;
		fin>>cm[a][k];
	}
	
	l=(1<<n)-1;
	int dp[n][l];
	short id[n][l];
	short lg[l];
	
	for(a=0;a<n;a++)
		for(i=1;i<=l;i++)
		{
			dp[a][i]=inf;
			id[a][i]=0;
		}
	
	for(a=0;a<n;a++)
	{
		dp[a][1<<a]=0;
		id[a][1<<a]=a;
		cm[a][a]=inf;
	}
	
	lg[1]=0;
	for(a=2;a<=l;a<<=1)
		lg[a]=lg[a/2]+1;
	
	for(i=1;i<=l;i++)
	{
		c1=i;	nr=0;
		while(c1)
		{
			v[++nr]=lg[zeros(c1)];
			c1-=zeros(c1);
		}
		for(c1=1;c1<=nr;c1++)
		{
			a=v[c1];
			for(c2=1;c2<=nr;c2++)
			{
				j=v[c2];
				if(cm[j][a]!=inf && dp[a][i^(1<<j)]!=inf)
				{
					k=dp[a][i^(1<<j)]+cm[j][a];
					if(k<dp[j][i])
					{
						dp[j][i]=k;
						id[j][i]=id[a][i^(1<<j)];
					}
				}
			}
		}
	}
	
	rez=inf;
	for(a=0;a<n;a++)
		rez=min(rez, dp[a][l]+cm[id[a][l]][a]);
	
	if(rez<inf)	fout<<rez<<"\n";
	else fout<<"Nu exista solutie\n";
}