Cod sursa(job #2294697)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 2 decembrie 2018 18:19:04
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#include<stdlib.h>

#include<vector>

using namespace std;

#define MAXN 18
#define MAXCOST 18000001

int M,N;
int X[MAXN];
int A[MAXN][MAXN];

int costminim=MAXCOST;

bool isok(int nod,int k){
	for(int i=0;i<(k-1);i++){
		if(X[i]==nod)
			return false;
	}
	return true;
}

void hamiltonian(int k,int cost){
	if(k==N){
		if(A[X[N-1]][X[0]]>0){
			cost+=A[X[N-1]][X[0]];
			if(cost<costminim)
				costminim=cost;
		}
		return;
	}

	for(int i=0;i<N;i++){
		if(A[X[k-1]][i]>0 && isok(i,k)){
			X[k]=i;
			hamiltonian(k+1,cost+A[X[k-1]][i]);
		}
	}
}

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

	scanf("%d %d",&N,&M);

	int x,y,c;

	for(int i=0;i<M;i++){
		scanf("%d %d %d",&x,&y,&c);
		//L[x].push_back(make_pair(y,c));
		A[x][y]=c;
	}

	X[0]=0;
	hamiltonian(1,0);	

	if(costminim==MAXCOST)
		printf("Nu exista solutie!\n");
	else
		printf("%d\n",costminim);

	return 0;
}