Cod sursa(job #404134)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 25 februarie 2010 20:30:52
Problema Ciclu hamiltonian de cost minim Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 100000000
#define vmax 1050000
#define nmax 25

int s[vmax][nmax], n, m, cost[nmax][nmax];
vector<int> a[nmax];

int main()
{
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, j, x, y, k;
	for (i=0; i<n; i++)
		for (j=0; j<n; j++) cost[i][j]=inf;
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d",&x,&y,&j);
		cost[x][y]=j;
		a[y].push_back(x);
	}
	for (i=0; i<1<<n; i++)
		for (j=0; j<n; j++) s[i][j]=inf;
	s[1][0]=0;
	for (i=0; i<1<<n; i++)
		for (j=0; j<n; j++)
			if (i & (1<<j))
				for (k=0; k<=a[j].size(); k++)
					if (i & (1<<a[j][k]))
						s[i][j]=min(s[i][j], s[i^(1<<j)][a[j][k]]+cost[a[j][k]][j]);
	int sol=inf;
	for (k=0; k<a[0].size(); k++)
		sol=min(sol, s[(1<<n)-1][a[0][k]]+cost[a[0][k]][0]);
	if (sol=='inf') printf("Nu exista solutie"); else printf("%d",sol);
}