[英]Need help understanding Dijkstra's Algorithm
我正在嘗試遵循Dijkstra算法的偽代碼,但我不了解它如何為我提供最短的路徑。 遵循以下偽代碼:
DijkstrasAlgorithm(G, w, s)
InitalizeSingleSource(G, s)
S = 0
Q = G.V
while Q != 0
u = ExtractMin(Q)
S = S∪{u}
for each vertex v ∈ G.Adj[u]
Relax(u, v, w)
這是我最終得到的代碼:
DijkstrasAlgorithm(string w, string s) {
string u;
string s;
InitalizeSingleSource(s);
for (map<string, Vertex*>::iterator it = vertices.begin();
it!=vertices.end(); ++it) {
minQ.insert(it->first, it->second->key);
}
while (u != "empty") {
u = minQ.extractMin();
if (!s.empty()) {
s.append("->");
}
s.append(u);
vector<Neighbor*>::iterator it = adjList[u].begin();
while (it != adjList[u].end()) {
relax(u, w, (*it)->weight);
it++;
}
}
return s;
}
問題是,這段代碼並沒有給我最短的路徑。 看着偽代碼,我不知道怎么回事。 如果我有5個頂點(A,B,C,d和e)讓我們說我想找到從A到C的最短路徑,這最短路徑為A-> B->℃。 這些代碼所要做的就是給我提供c-> e-> d-> b-> a。
我只是不了解這里的邏輯。 我們使用InitalizeSingleSource(s)將頂點的所有鍵值初始化為INT_MAX,但s除外,s為0。從這里,我們找到頂點鍵值的最小值,而不是使用adjList。
相反,停止,一旦我們的路徑的末尾,我們停車時minQ是空的。 所有這些操作是打印所有頂點而不是最短路徑。 在此之上,我們設置大部分鍵INT_MAX的,所以找到最小值之間的所有感覺多余。
一旦完成,我們所有的放松與GE / G.Adj函數[U]即使我們沒有在我們最小徑的測量使用的邊緣了。
有很多是沒有意義給我,但我想最奇怪的部分是基於頂點(GV),而不是邊緣(GE)設置Q / minQ。 應該如何找到最小路徑? 誰能解釋我不理解的算法偽代碼的哪一部分? 謝謝!
編輯:包括“放松”的功能了。
relax(string u, string v, int weight) {
if (vertices[v]->key > (vertices[u]->key + weight)) {
vertices[v]->key = (vertices[u]->key + weight);
vertices[v]->pi = new std::string(u);
}
}
放松會降低minQ中的值。
因為0 <MAX_INT,所以第一個提取的節點是源。 然后,每個相鄰節點都放松,這將其minQ值減小到0 + c,其中c是從源到節點的邊緣成本(如果它小於當前的minQ值)。 這是這種情況,因為先前的值都是INT_MAX。
現在,已將與源相鄰的所有頂點標記為已經找到的最短路徑。
然后,處理后的頂點之一將具有最低的minQ值,然后將其提取並進行處理。
現在,您應該能夠看到這個“提取”->“松弛”周期如何產生一個圖形,在該圖形中,每個節點都標有達到該目標的最低成本。
如果每次放松時都更新指向“放松源”節點的指針,則可以從所需的目標節點向后走以讀取最短路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.