簡體   English   中英

在無向加權圖中找到兩個節點之間的所有路徑的算法

[英]Algorithm to find all path between two nodes in an undirected weighed graph

我有一個像這樣的無向圖:

let list = new Map([
    ["A", [["B", "rdWeight"], ["C", "rdWeight"]]],
    ["B", [["A", "rdWeight"], ["E", "rdWeight"]]],
    ["C", [["D", "rdWeight"], ["A", "rdWeight"]]],
    ["D", [["C", "rdWeight"], ["E", "rdWeight"]]],
    ["E", [["B", "rdWeight"], ["D", "rdWeight"]]]
]);

rdWeight只是一個隨機字符串作為權重。 查找兩個節點(頂點)之間所有路徑的功能是命中或未命中,我不明白如何。 這是我正在使用的功能:

function findPath(list, start, end) {
    let paths = [];
    let visited = new Set();
    let queue = [];
    queue.push([start, [start]]);
    while (queue.length > 0) {
        let [current, path] = queue.shift();
        visited.add(current);
        if (current === end) {
            paths.push(path);
        }
        for (let [neighbor] of list.get(current)) {
            if (!visited.has(neighbor)) {
                queue.push([neighbor, [...path, neighbor]]);
            }
        }
    }
    return paths;
}

它在我給出findPath(list, "A", "D")時有效,給出 2 個路徑[ [ 'A', 'C', 'D' ], [ 'A', 'B', 'E', 'D' ] ]但不是在findPath(list, "A", "E")的情況下,只給出一個路徑。 請告訴我我的代碼在哪里出現故障。

當您的算法找到目標節點並將其標記為已訪問時,它將不可能在隊列中再次推送該目標(對於替代路徑),因此它只能找到相同(最短)長度的路徑.

而不是使用一個visited集,您只需要檢查路徑是否沒有形成循環,這意味着您應該只檢查節點是否在您正在使用的路徑中。

一個簡單的更正是改變這個:

        if (!visited.has(neighbor)) {

        if (!path.includes(neighbor)) {

...但是這種任務可以更好地使用深度優先算法來完成,它需要更少的內存。 例如,使用遞歸生成器:

 function* findPath(list, start, end, visited=new Set) { if (start === end) return yield [...visited, end]; visited.add(start); for (let [neighbor] of list.get(start)) { if (!visited.has(neighbor)) { yield* findPath(list, neighbor, end, visited); } } visited.delete(start); } let list = new Map([ ["A", [["B", "rdWeight"], ["C", "rdWeight"]]], ["B", [["A", "rdWeight"], ["E", "rdWeight"]]], ["C", [["D", "rdWeight"], ["A", "rdWeight"]]], ["D", [["C", "rdWeight"], ["E", "rdWeight"]]], ["E", [["B", "rdWeight"], ["D", "rdWeight"]]] ]); console.log([...findPath(list, "A", "E")]);

暫無
暫無

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

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