【发布时间】:2021-04-21 04:15:35
【问题描述】:
我正在尝试解决一个问题,我需要在图中找到 2 个点之间的最大距离。我编写了这段代码来实现 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];
}
【问题讨论】:
-
bfsQueue 应该是一个优先级队列,或者其他排序的数据结构,而不仅仅是一个 LinkedList。
-
另外,不知道例如的实现
Edge,很难判断distanceMap.get(new Edge(...))是否按预期工作。您是否正确覆盖了Edge.equals()和Edge.hashCode()? -
请举例说明它不起作用。
-
@cello 我认为这可能是问题所在。排序后的数据结构在这里有何不同,请您详细说明!
-
@Henry 我正在用手机打字,所以我会在我在家时发布示例。