Cod sursa(job #3260817)

Utilizator PreparationTurturica Eric Preparation Data 3 decembrie 2024 19:41:29
Problema Ciclu hamiltonian de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <vector>
#include <functional>
#include <limits.h>
#define MAX_N 25
#define lol long long

using namespace std;
vector<pair<int, int> > edges[MAX_N];
lol dp[1 << 18][MAX_N]; // last node

int main()
{
	FILE *fin = fopen("hamilton.in", "r");
	FILE *fout = fopen("hamilton.out", "w");
	int n, m;
	fscanf(fin, "%d %d", &n, &m);
	for (int i = 0; i < m; i++) {
		int a, b, c;
		fscanf(fin, "%d %d %d", &a, &b, &c);
		edges[a].push_back({b, c});
	//	edges[b].push_back({a, c});
	}
	for (int i = 0; i < (1 << n); i++)
		for (int j = 0; j < n; j++)
			dp[i][j] = INT_MAX;
	dp[0][0] = 0;
	for (int i = 0; i < (1 << n); i++) {
		for (int j = 0; j < n; j++) {
			if (dp[i][j] == INT_MAX)
				continue;
			for (auto k: edges[j]) {
	  			int nxt = k.first;
				if (((1 << nxt) & i) != 0)
					continue;
				int neww = i | (1 << nxt);
				if (nxt == 0 && neww != ((1 << n) - 1))
					continue;
				//printf("%d %d %d\n", nxt, i | (1 << nxt), j);
				dp[neww][nxt] = min(dp[neww][nxt], dp[i][j] + k.second);
				
			}

		}
	}
	//printf("alyo\n");
	lol result = INT_MAX;
	for (int i = 0; i < n; i++)
		result = min(result, dp[(1 << n) - 1][i]);
	fprintf(fout, "%lld\n", (result == INT_MAX) ? -1 : result);
}