Cod sursa(job #675963)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 8 februarie 2012 15:15:17
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

int n,m,i,j,S[262200][20],cost[20][20],INF=100000000;
vector<int> V[20];
void read(),solve();

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);
	int x,y;
	scanf("%d%d",&n,&m);
	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",&x,&y);
		V[y].push_back(x);
		scanf("%d",&cost[x][y]);
	}
	for(i=0;i< (1<<n);i++)
		for(j=0;j<n;j++)
			S[i][j]=INF;
}

void solve()
{
	S[1][0]=0;
	for(i=0;i< (1<<n);i++)
	{
		for(j=0;j<n;j++)
		{
			if(i&(1<<j))
			{
				for(vector<int>::iterator it=V[j].begin();it!=V[j].end();it++)
				{
					if(i&(1<<*it))
					{
						S[i][j]=min(S[i][j],S[i^(1<<j)][*it]+cost[*it][j]);
					}
				}
			}
		}
	}
	int sol=INF;
	for(vector<int>::iterator it=V[0].begin();it!=V[0].end();it++)
		sol=min(sol,S[(1<<n)-1][*it]+cost[*it][0]);
	
	if(sol==INF)printf("Nu exista solutie\n");
	else        printf("%d\n",sol);  
}