Cod sursa(job #925859)

Utilizator taigi100Cazacu Robert taigi100 Data 24 martie 2013 19:47:11
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define maxn 20
#define maxx 262150
#define inf 100000000
#define min(a,b) ((a)<(b) ? (a):(b))
int n,m,sol;
int cost[maxn][maxn],C[maxx][maxn];
vector<int> v[maxn];


int main()
{
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);

	scanf("%d%d",&n,&m);

	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cost[i][j]=inf;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		v[y].push_back(x);
		scanf("%d",&cost[x][y]);
	}

	for(int i=0;i< 1<<n ;i++)
		for(int j=0; j< n ;j++)
			C[i][j]=inf;

	C[1][0]=0;

	for(int i=0;i< 1<<n;i++)
		for(int j=0;j<n;j++)
			if( i & (1<<j) )
				for(size_t k=0;k<v[j].size(); k++)
					if ( i & (1<<v[j][k]) )
						C[i][j]=min(C[i][j],C[i^(1<<j)][v[j][k]] + cost[v[j][k]][j]);
	sol=inf;
	for(size_t i=0;i< v[0].size(); i++)
		sol=min(sol,C[(1<<n)-1][v[0][i]]+cost[v[0][i]][0]);
	if(sol==inf) printf("Nu exista solutie");
	else printf("%d",sol);
}