Pagini recente » Rating Avram Simona (avsi_bv) | Cod sursa (job #406066) | Profil Crina | Istoria paginii utilizator/novakmilan | Cod sursa (job #2820190)
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> citireLisAdiacenta()
{
ifstream fin("hamilton.in");
vector<vector<pair<int,int>>> lisAdiacenta;
int N, M;
fin >> N >> M;
lisAdiacenta.resize(N);
for (int i = 1; i <= M; ++i) {
int x, y, c;
fin >> x >> y >> c;
lisAdiacenta[x].push_back({y,c});
}
return lisAdiacenta;
}
int hamilton(vector<vector<pair<int,int>>> &lisAdiacenta)
{
vector<vector<int> > dpCost(1 << lisAdiacenta.size(), vector<int>(lisAdiacenta.size(), 0x3f3f3f3f));
int costTotal;
dpCost[1][0] = 0;
for (int i = 0; i < 1 << lisAdiacenta.size(); ++i) { //toate ciclurile
for (int j = 0; j < lisAdiacenta.size(); ++j) {
if (i & (1<<j)) {
for (int k = 0; k < lisAdiacenta[j].size(); ++k){
if (i & (1<<lisAdiacenta[j][k].first)) {
dpCost[i][j] = min(dpCost[i][j], dpCost[i ^ (1<<j)][lisAdiacenta[j][k].first] + lisAdiacenta[j][k].second);
}
}
}
}
}
costTotal = 0x3f3f3f3f;
for (int i = 0; i < lisAdiacenta[0].size(); ++i) {
costTotal = min(costTotal, dpCost[(1<<lisAdiacenta.size()) - 1][lisAdiacenta[0][i].first] + lisAdiacenta[0][i].second);
}
return costTotal;
}
int main()
{
vector<vector<pair<int,int>>> lisAdiacenta = citireLisAdiacenta();
int rezultat = hamilton(lisAdiacenta);
ofstream fout("hamilton.out");
fout << rezultat;
return 0;
}