簡體   English   中英

最多使用 k 個頂點的有向加權圖中的最短路徑

[英]Shortest path in a directed weighted graph that uses at most k vertices

我正在嘗試解決具有非負權重的連通有向加權循環圖中的 SSSP 問題。 這里的問題是,這個問題要求使用最多 k 個頂點的 SSSP。

我嘗試使用修改后的 dijkstra 算法來解決這個問題,在我的優先級隊列中保留一個 3 元組。 即(頂點權重,該頂點路徑中的頂點數(包括),頂點索引)。 我的算法可以防止超過 k 個頂點的節點被推入優先級隊列,從而被考慮在最短路徑中。

不知何故,我的算法得到了錯誤的答案。 一個原因是,如果最初較小的加權邊導致無效路徑,而最初較大的加權邊導致有效路徑,那么我的算法(貪婪)將報告它找不到通往目的地的有效路徑。

編輯:解決方案代碼已編輯,因為它沒有幫助。

我發現很難閱讀你的代碼 - 所以也許你已經這樣做了:給每個頂點一個最佳路徑的集合(編輯:實際上每個頂點只存儲每個可能路徑的前一步),存儲最少的對於訪問的頂點數量來說很昂貴,一旦路徑超過最大頂點數,您就可以丟棄它,但是您不能丟棄更昂貴(就總邊長而言)的路徑,直到您知道更便宜的路徑最終會到達目標在可接受的頂點數。 最后,您可能有不止一條完整的路徑,並且無論頂點數量如何,您只需選擇邊緣開銷最小的(如果有太多,您已經放棄了)

(如果您為存儲為成對等的某些內容創建一個類/結構,您的代碼將更易於閱讀,那么您可以為成員提供比 second.first 等更清晰的名稱。即使您對當前的命名,如果以上沒有幫助,額外的清晰度可能會幫助您獲得其他一些答案。)

編輯回答:“我如何保留更昂貴的路徑,直到我知道更便宜的路徑將導致解決方案?”

您的優先級隊列幾乎已經這樣做了 - 並不是每個頂點 (n) 都像我最初暗示的那樣存儲了完整的路徑,目前您只存儲用於到達頂點 n 的最佳前一個頂點 (n-1) - 及其成本及其頂點數。 我是說,不是為頂點 n-1 存儲一個最佳選擇,而是存儲多個選項,例如,使用 3 個先前頂點到 A 的最佳路線來自頂點 B,成本為 12,而使用 4 的最佳路線來自頂點 C並花費 10。(在所有上述最佳方式中,迄今為止在搜索中找到的最佳方式)

您只需要為給定數量的頂點存儲最便宜的路線。 如果(但僅當)它在成本或頂點數方面更好,則您保留一條路線。

在我上面的示例中,您需要同時保留兩者,因為到達此頂點的更便宜的路線使用更多先前的頂點,因此可能會導致到達目標之前的頂點過多 - 在該階段尚不清楚最終哪條路徑最好。

因此,您需要更改集合類型以及丟棄選項的規則。 例如,您可以使用 std::map ,其中先前的頂點計數是鍵,總邊成本和先前的頂點 ID 存儲在值中,或者使用索引是計數的總成本數組。

我認為您想為每個節點存儲兩個增量器:一個用於節點計數,另一個用於加權距離。 您可以使用節點計數作為早期終止符來從潛在選項集中丟棄這些路徑。 您使用加權距離選擇下一個要迭代的節點,並根據節點數丟棄。 通過這種方式,如果您將外圍上的所有節點完全終止為可丟棄的,那么您就會知道沒有符合條件的路徑最多達到所需的跳數。 如果您到達外圍節點列表中的目的地,那么您會自動知道它不會超過限制數量的節點,並且通過歸納,您知道它已經是到達那里的最短路徑,因為可以從以下位置找到所有其他路徑那么就一定已經有更長的路徑了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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