Pagini recente » Cod sursa (job #2378863) | Cod sursa (job #2286581) | Cod sursa (job #2138719) | Cod sursa (job #890446) | Cod sursa (job #2209425)
#include <cstdio>
#include <vector>
#include <algorithm>
const int MAX_N = 18;
const int INF = 2000000000;
struct Edge {
int v, cost;
};
std::vector<Edge> neighbours[MAX_N];
int n;
int Backt[MAX_N][262144];
int backt(int u, int visited) {
if (Backt[u][visited] == 0) {
Backt[u][visited] = INF;
if (visited == (1 << n) - 1 && u == 0)
Backt[u][visited] = 0;
else
for (Edge e : neighbours[u])
if ((visited & (1 << e.v)) == 0) // !visited[e.v]
// ((visited >> e.v) & 1) == 0
Backt[u][visited] = std::min(Backt[u][visited],
e.cost + backt(e.v, visited ^ (1 << e.v)));
}
return Backt[u][visited];
}
int main() {
freopen("hamilton.in", "r",stdin);
freopen("hamilton.out", "w",stdout);
int m,r;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v, cost;
scanf("%d%d%d", &u, &v, &cost);
neighbours[u].push_back({v,cost});
}
r=backt(0, 0);
if(r==INF)
printf("Nu exista solutie");
else
printf("%d\n", r);
return 0;
}