Pagini recente » Cod sursa (job #1634952) | Cod sursa (job #1573723) | Cod sursa (job #3291805) | Cod sursa (job #3237868) | Cod sursa (job #2934410)
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 18
#define INF 1000000000
int noNodes, noEdges;
vector<int> graph[MAX_N];
int cost[MAX_N][MAX_N];
int dp[MAX_N][1 << MAX_N];
void addEdge(int x, int y, int c) {
graph[x].push_back(y);
cost[x][y] = c;
}
bool hasEdge(int x, int y) {
unsigned int i;
i = 0;
while (i < graph[x].size() && graph[x][i] != y)
++i;
return i < graph[x].size();
}
int main() {
FILE *fin, *fout;
fin = fopen("hamilton.in", "r");
fout = fopen("hamilton.out", "w");
int i, j, mask;
int x, y, c;
int minCost;
fscanf(fin, "%d%d", &noNodes, &noEdges);
for (i = 0; i < noNodes; ++i)
for (j = 0; j < noNodes; ++j)
cost[i][j] = INF;
for (i = 0; i < noEdges; ++i) {
fscanf(fin, "%d%d%d", &x, &y, &c);
addEdge(x, y, c);
}
for (mask = 0; mask < (1 << noNodes); ++mask)
for (i = 0; i < noNodes; ++i)
dp[i][mask] = INF;
dp[0][1 << 0] = 0;
for (mask = 0; mask < (1 << noNodes); ++mask)
for (i = 0; i < noNodes; ++i)
if (mask & (1 << i))
for (int j : graph[i])
if ((mask & (1 << j)))
dp[j][mask] = min(dp[j][mask], dp[i][mask - (1 << j)] + cost[i][j]);
minCost = INF;
for (int j : graph[0])
minCost = min(minCost, dp[j][(1 << noNodes) - 1] + cost[j][0]);
if (minCost == INF)
fprintf(fout, "Nu exista solutie\n");
else
fprintf(fout, "%d\n", minCost);
fclose(fin);
fclose(fout);
return 0;
}