2016-07-30 57 views
0

試圖實現圖的雙向搜索,但失敗了很多次。 據我瞭解,我應該以某種方式合併2個廣度優先搜索「開始」和「結束」頂點。基本情況是當兩個樣本都找到相同的頂點時。 您能否提供一個代碼示例(如果可能,請使用Java或JavaScript)或鏈接到雙向搜索的代碼。圖的雙向搜索實現

+0

問計場外資源是題外話。你如何用你的代碼展示你的問題[mcve]? –

+0

#cricket_007我不知道如何開始寫這樣的代碼。我已經花了8天的時間嘗試去做。我沒有任何代碼,因爲我不知道如何開始思考編寫代碼。這就是爲什麼我沒有任何代碼示例。對於那個很抱歉。我需要提示。 –

+0

我不明白什麼是雙向搜索。常規深度或寬度首次搜索有什麼問題? –

回答

5

假設你有節點是這樣的:

public static class Node { 
    private final T data; 
    private final Set<Node> adjacent = new HashSet<Node>(); 

    public Set<Node> getAdjacent() { 
     return adjacent; 
    } 

    public Node(T data) { 
     this.data = data; 
    } 

    public T getData() { 
     return data; 
    } 

    // returns if the node was added, false if already there 
    public boolean addAdjacent(Node node) { 
     return adjacent.add(node); 
    } 

    // returns true if any were added 
    public boolean addAdjacents(Set<Node> nodes) { 
     return adjacent.addAll(nodes); 
    } 
} 

那麼我認爲你是這樣的事情後:

public static boolean pathExistsBidirectional(Node a, Node b) { 
    // BFS on both nodes at the same time 
    Queue<Node> queueA = new Queue<Node>(); 
    Queue<Node> queueB = new Queue<Node>(); 
    Set<Node> visitedA = new HashSet<Node>(); 
    Set<Node> visitedB = new HashSet<Node>(); 

    visitedA.add(a); 
    visitedB.add(b); 
    queueA.add(a); 
    queueB.add(b); 

    while (!queueA.isEmpty() && !queueB.isEmpty()) { 
     if (pathExistsBidirectionalHelper(queueA, visitedA, visitedB)) { 
     return true; 
     } 
     if (pathExistsBidirectionalHelper(queueB, visitedB, visitedA)) { 
     return true; 
     } 
    } 

    return false; 
    } 

    private static boolean pathExistsBidirectionalHelper(Queue<Node> queue, Set<Node> visitedFromThisSide, Set<Node> visitedFromThatSide) { 
    if (!queue.isEmpty()) { 
     Node next = queue.remove(); 
     for (Node adjacent : next.getAdjacent()) { 
     if (visitedFromThatSide.contains(adjacent)) { 
      return true; 
     } else if (visitedFromThisSide.add(adjacent)) { 
      queue.add(adjacent); 
     } 
     } 
    } 
    return false; 
    } 
+0

我已使用 測試過此節點node1 = new Node(「jan」); 節點node2 =新節點(「karol」); 節點node3 =新節點(「lukasz」); node1.addAdjacent(node2); node2.addAdjacent(node3); System.out.println(pathExistsBidirectional(node1,node3)); 它不起作用,打印錯誤...或者我做錯了嗎? – hanskoff