Cod sursa(job #744220)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 8 mai 2012 08:09:14
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
int n,m,cost[20][20];
vector <int> G[20];
int mask[20],C[263000][20],sol=2000000000;

void Citire()
{
	int i,x,y,c;
	ifstream fin("hamilton.in");
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>c;
		cost[x][y]=c;
		G[x].push_back(y);
	}
	fin.close();
}

void Rezolvare()
{
	if(n==1)
	{
		sol=0;
		return;
	}
	int i,conf,lim;
	vector <int>::iterator it;
	for(i=0;i<n;i++)
		mask[i]=(1<<i);
	lim=(1<<n);
	for(conf=0;conf<lim;conf++)
		for(i=0;i<n;i++)
			C[conf][i]=2000000000;
	C[1][0]=0;
	for(conf=0;conf<lim;conf++)
	{
		for(i=0;i<n;i++)
		{
			if((conf&mask[i])!=0)
			{
				for(it=G[i].begin();it!=G[i].end();it++)
				{
					if((mask[*it]&conf)==0)
						C[conf|mask[*it]][*it]=min(C[conf|mask[*it]][*it],C[conf][i]+cost[i][*it]);
				}
			}
		}
	}
	conf=lim-1;
	for(i=1;i<n;i++)
	{
		if(cost[i][0]!=0)
			sol=min(sol,C[conf][i]+cost[i][0]);
	}
}

void Afisare()
{
	ofstream fout("hamilton.out");
	if(sol==2000000000)
		fout<<"Nu exista solutie\n";
	else
		fout<<sol<<"\n";
	fout.close();
}

int main()
{
	Citire();
	Rezolvare();
	Afisare();
	return 0;
}