簡體   English   中英

需要幫助來了解Dijkstra的算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM