Cod sursa(job #2935350)

Utilizator LuciBBadea Lucian LuciB Data 6 noiembrie 2022 16:27:05
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int NMAX = 18;
const int INF = 10LL * 1e9;

struct Edge {
	int neighbour, cost;
};

vector<Edge> graph[NMAX];

int cost[NMAX][NMAX];

int dp[NMAX][(1 << NMAX)];

signed main() {
	int n, m;
	FILE *fin, *fout;
	fin = fopen("hamilton.in", "r");
	fout = fopen("hamilton.out", "w");
    fscanf(fin, "%lld%lld", &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 < m; i++) {
        int a, b, c;
        fscanf(fin, "%lld%lld%lld", &a, &b, &c);
        graph[a].push_back({b, c});
        cost[a][b] = c;
    }
    for(int i = 0; i < n; i++)
		for(int mask = 0; mask < (1 << n); mask++)
			dp[i][mask] = INF;
	dp[0][1] = 0;
    for(int mask = 1; mask < (1 << n); mask++) {
        for(int i = 0; i < n; i++) {
            if(mask & (1 << i)) {
                for(Edge x : graph[i]) {
                    if(mask & (1 << x.neighbour)) {
                        dp[x.neighbour][mask] = min(dp[x.neighbour][mask], dp[i][mask - (1 << x.neighbour)] + cost[i][x.neighbour]);
                    }
                }
            }
        }
    }
    int ans = INF;
    for(int i = 1; i < n; i++) {
        ans = min(ans, dp[i][(1 << n) - 1] + cost[i][0]);
    }
    if(ans == INF)
		fprintf(fout, "Nu exista solutie");
	else fprintf(fout, "%lld", ans);
	fclose(fin);
	fclose(fout);
	return 0;
}