簡體   English   中英

實施 Dijkstra 算法的問題

[英]Issue in Implementing Dijkstra's algorithm

我正在嘗試解決一個問題,我需要找到圖中兩點之間的最大距離。 我編寫這段代碼是為了實現 Dijkstra 算法(顯然是通過將最小化更改為最大化),但它在某些情況下似乎不起作用,而且我無法弄清楚未處理的情況。 任何人都可以幫助我指出我在實施中遺漏了什么,或者是否存在本質上不正確的地方?

public double maxDistance(int n, int start, int end) {
    
    Map<Integer, List<Integer>> adjacencyList = getAdjacencyList(); // Adj. list in form of HashMap 
    Map<String, Double> distanceMap = getDistanceMap(); // <Edge, Double> (value is distance)
    Queue<Integer> bfsQueue = new LinkedList<>(); // queue to do a BFS
    
    boolean[] visited = new boolean[n];
    double[] distance = new double[n];
    
    bfsQueue.add(start);
    
    while (!bfsQueue.isEmpty()) {
        int node = bfsQueue.poll();
        
        List<Integer> neighbors = adjacencyList.getOrDefault(node, new ArrayList<>());
        for (int neighbor: neighbors) {
            if (visited[neighbor]) continue;
            bfsQueue.add(neighbor);
            double edgeLength = distanceMap.get(new Edge(node, neighbor));
            double newLength = distance[node] + edgeLength;
            if (newLength > distance[neighbor]) {
                distance[neighbor] = newLength;
            }
        }
        visited[node] = true;
    }

    return distance[end];
}

首先,Dijkstra 算法找到最短路徑,因此它應該是minDistance ,而不是maxDistance

接下來,要實現廣度優先搜索,你需要一個排序的數據結構。 您的bfsQueue目前只是一個LinkedList 使用鏈接列表,您可以按插入順序迭代項目。 但在 Dijkstra 的算法中,始終處理下一個最近的鄰居很重要。 因此,它通常使用優先級隊列來實現。

例如,為什么這會有所不同:圖像你想從 A 到 B go。有兩條路線可用,一條長的路線由兩條邊組成,另一條較短的路線由 4 條邊組成。 在您的情況下,您基本上是通過圖形從一開始就按邊數擴展,而不是按距離擴展。 所以你會首先找到由兩條邊組成的路線,即使這是較慢的一條。

如果您使用PriorityQueue ,請注意像您當前所做的那樣減少鄰居的距離/優先級( if (newLength > distance[neighbor]) { distance[neighbor] = newLength; } )將不起作用,因為優先級隊列不會自動重新排序。 您必須先從優先級隊列中刪除鄰居,更新距離,然后將其重新插入優先級隊列,以便將其排序到正確的位置。

暫無
暫無

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

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