Cod sursa(job #2489508)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 8 noiembrie 2019 20:49:45
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include<cstdio>
#include<vector>
using namespace std;

const int NMAX=20;
const int MAXX=262150;
const int INF=100000000;

int cost[NMAX][NMAX],c[MAXX][NMAX];
vector <int> v[NMAX];

int main(){
	freopen("hamilton.in","r",stdin);
	freopen("hamilton.out","w",stdout);
	int n,m;
	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(int k=0;k<(int)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]);
	int sol=INF;
	for(int i=0;i<(int)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\n", sol);
	return 0;
}