ダイクストラのアルゴリズムを 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 nodes
int 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
}
再帰を介して、探しているノードが見つかるまですべてのノードを探索しようとしています。その後、カスケード リターンを関数呼び出しスタックの一番上まで戻し、合計コストを合計します。
パフォーマンスはそれほど重要ではありませんが、再帰を使用すると必要以上に難しくなる場合は、コードを書き直すことにオープンです。