Я нашел кратчайший путь для задачи коммивояжера, используя метод возврата. График, который мне дали, был таким:
{
{0, 15, 10, 25},
{10, 0, 40, 15},
{45, 15, 0, 20},
{10, 35, 10, 0}
}
Используемый код
int tspBacktrackRecursive(int v, int n, int graph[][n], bool *visited, int nodesVisited, int currentCost, int minCost){
if(currentCost > minCost)
return minCost;
visited[v] = true;
nodesVisited++;
path[nodesVisited - 1] = v;
int i;
if(nodesVisited == n){
visited[v] = false;
if(graph[v][0] + currentCost < minCost){
int j;
for(j = 0; j < n; j++)
finalpath[j] = path[j];
path[nodesVisited - 1] = 0;
return (graph[v][0] + currentCost);
}
return minCost;
}
for(i = 0; i < n; i++){
if(!visited[i]){
minCost = tspBacktrackRecursive(i, n, graph, visited, nodesVisited, currentCost + graph[v][i], minCost);
}
}
path[nodesVisited - 1] = 0;
visited[v] = false;
return minCost;
}
int tspBackTrack(int n, int graph[][n]){
bool* visited = (bool*)calloc(n, sizeof(bool));
finalpath = (int*)calloc(n, sizeof(int));
path = (int*)calloc(n, sizeof(int));
return tspBacktrackRecursive(0, n, graph, visited, 0, 0, __INT_MAX__);
}
int *printPath(int n, int graph[][n]){
return finalpath;
}
Минимальный вес, который я нашел, был таким: - 50
Программа кратчайшего пути выглядела так: - (0, 2, 1, 3)
Проблема в том, что я не знаю, прав ли я. Помоги мне здесь ....