Pagini recente » Profil sebinechita | Cod sursa (job #2852129) | Cod sursa (job #3174214) | Cod sursa (job #744971) | Cod sursa (job #2224302)
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const string IN_FILE = "hamilton.in";
const string OUT_FILE = "hamilton.out";
const int INF = 0x3f3f3f3f;
inline int getBit(const int mask, const int bit) {
return (mask >> bit) & 1;
}
inline int flip(const int mask, const int bit) {
return mask ^ (1 << bit);
}
int solve(const vector<vector<int>>& costs) {
const int n = int(costs.size());
auto dp = vector<vector<int>>(1 << n, vector<int>(n, INF));
dp[1][0] = 0;
for (int mask = 2; mask < (1 << n); mask++) {
for (int last = 0; last < n; last++) {
if (getBit(mask, last) == 0) continue;
for (int prev = 0; prev < n; prev++) {
if (prev == last || getBit(mask, prev) == 0) continue;
dp[mask][last] = min(
dp[mask][last],
dp[flip(mask, last)][prev] + costs[prev][last]);
}
}
}
int minCost = INF;
for (int last = 1; last < n; last++) {
minCost = min(minCost, dp[(1 << n) - 1][last] + costs[last][0]);
}
return minCost;
}
vector<vector<int>> readInput() {
ifstream in(IN_FILE);
int V, E;
in >> V >> E;
auto costs = vector<vector<int>>(V, vector<int>(V, INF));
for (int i = 0; i < V; i++) {
costs[i][i] = 0;
}
for (int i = 0; i < E; i++) {
int u, v, c;
in >> u >> v >> c;
costs[u][v] = c;
}
in.close();
return costs;
}
void writeOutput(const int result) {
ofstream out(OUT_FILE);
if (result == INF) {
out << "Nu exista solutie\n";
} else {
out << result << "\n";
}
out.close();
}
int main() {
const auto costs = readInput();
const int result = solve(costs);
writeOutput(result);
return 0;
}