Cod sursa(job #2490195)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 9 noiembrie 2019 21:35:46
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("hamilton.in");
ofstream fout ("hamilton.out");
#define NMAX 23
#define MAXX 262145
#define INF 100000003
int cost [NMAX][NMAX], C [MAXX][NMAX];
vector <int>v [NMAX];
int n, m, x, y, ans = INF;
int main(){
	fin >> n >> m;
	for (int i = 0; i < n; i ++)
		for (int j = 0; j < n; j ++)
            cost [i][j] = INF;
    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 = 1; i <= m; i ++){
		fin >> x >> y;
		v [y].push_back (x);
		fin >> cost [x][y];
	}
	for (int i = 0; i < (1 << n); i ++){
		for (int j = 0; j < n; j ++){
			if (i & (1 << j)){
				for (int 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]);
			}
		}
	}
	for (int i = 0; i < v [0].size (); i ++)
		ans = min (ans, C [(1 << n) - 1][v [0][i]] + cost [v [0][i]][0]);
	if (ans == INF)
        fout << "Nu exista solutie";
	else fout << ans;
	return 0;
}