Вы можете использовать next_permutation, чтобы получить все перестановки для вектора.Вы перебираете все перестановки, вычисляя стоимость и отслеживая минимальную стоимость.Ниже приведена реализация вашего второго примера.
int main(int argc, char** argv) {
const int NUM_NODES = 5;
int adjacencyMatrix[NUM_NODES][NUM_NODES] = {
{0, 10, 16, 12, 8},
{10, 0, 15, INT_MAX, 20},
{16, 15, 0, 10, INT_MAX},
{12, INT_MAX, 10, 0, 8},
{8, 20, INT_MAX, 8, 0}
};
int min;
int bestScore = INT_MAX;
int currentScore = 0;
vector<int> bestTrip;
vector<int> trip;
int legCost = 0;
//set a default trip
for (int i = 0; i < NUM_NODES; ++i) {
trip.insert(trip.end(), i);
}
//insert trip back home
trip.insert(trip.end(), 0);
while (next_permutation(trip.begin() + 1, trip.end() - 1)) {
currentScore = 0;
for (int i = 0; i < NUM_NODES; i++) {
legCost = adjacencyMatrix[trip[i]][trip[i + 1]];
if (legCost == INT_MAX || currentScore == INT_MAX) {
currentScore = INT_MAX;
} else {
currentScore += legCost;
}
}
if (currentScore < bestScore) {
bestScore = currentScore;
bestTrip = trip;
}
}
cout << "best trip: ";
for (int i = 0; i < NUM_NODES + 1; i++) {
cout << bestTrip[i];
}
cout << endl;
cout << "best score:" << bestScore << endl;
return 0;
}