Алгоритм Дейкстры, псевдокод

Я пытаюсь написать алгоритм Дейкстры на C ++, и в Интернете есть бесчисленное множество примеров, но я просто не могу понять, как эти примеры работают. Я бы предпочел сделать это так, чтобы это имело смысл, чтобы я мог лучше понять алгоритм. Я знаю, как должен работать сам алгоритм, и я написал некоторый код. Мне было интересно, если кто-то мог указать на недостаток в моем мыслительном процессе. Я предпочитаю представлять свой график как крайний список. Я напишу в псевдокоде, потому что мой настоящий код огромный беспорядок:

class Node{
vector<node> linkVector;           //links to other nodes, generated at random
int cost;                     //randomly generated by constructor
bool visited = false;
}

vector<node> edgelist;           //contains all nodesint main(){
create n Nodes
add all nodes to edgeList
for each node {
randomly add WEIGHT nodes to linkVector
}
findPath(initialNode)
}

int findPath(Node start, node want, int cost=0){   //returns cost from src to dest
if(start==want) return cost;
if(every node has been visited) return 0;        //this is in case of failure
Node result = getMinimumCost()    //finds node in linkVector with least cost
result.visited(true)  //so we don't get stuck in a loop
findPath(result, want, result.getCost() + cost);  //recursive call
}

Посредством рекурсии я пытаюсь исследовать все узлы, пока не найду тот, который ищу, затем вернусь и переместюсь каскадными возвратами обратно на вершину стека вызовов функций, все время добавляя общую стоимость.

Производительность на самом деле не имеет значения, но если использование рекурсии делает ее намного сложнее, чем нужно, я открыт для переписывания своего кода.

1

Решение

Алгоритм Дейкстры не является рекурсивным. Рекурсивный алгоритм оказался бы в первую очередь глубиной, тогда как алгоритм Дейкстры в ширину поиск.

Основная идея заключается в том, что у вас есть приоритетная очередь не посещенных узлов. На каждой итерации вы вытягиваете узел с кратчайшего расстояния от начала очереди и визит Это. Затем вы обновляете расстояния до каждого из его непосещенных соседей.

Алгоритм на основе очереди, такой как этот, не поддается рекурсивной реализации. Поиск не исследует один путь к исчерпанию, пока не попробует альтернативный путь, как поиск в глубину. Он исследует много путей одновременно, только исследуя их, пока они являются самым дешевым путем. Как только текущий путь перестает быть самым дешевым, он переходит на другой путь. Рекурсия не позволяет вам «прыгать» с пути на путь.

Вы можете увидеть это поведение на графике из Статья в википедии.

введите описание изображения здесь

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]