我想在未加权的图表中找到所有最短路径。在我的第一次尝试中,我设法找到了使用BFS的一条短路径。
我使用堆栈来保存最短路径和BFS队列。
visited
向量用于标记是否访问了节点。
这就是我在Java中所做的:
public ArrayList<Integer> BFS(int source, int dest) {
ArrayList<Integer> shortestPathList = new ArrayList<Integer>();
boolean[] visited = new boolean[100];
Queue<Integer> q = new LinkedList<Integer>();
Stack<Integer> pathStack = new Stack<Integer>();
q.add(source);
pathStack.add(source);
visited[source] = true;
while (!q.isEmpty()) {
int u = q.poll();
for (int v : graph.getNeighboursOf(u)) {
if (!visited[v]) {
q.add(v);
visited[v] = true;
pathStack.add(v);
if (u == dest)
break;
}
}
}
// To find the path
int node, currentSrc = dest;
shortestPathList.add(dest);
while (!pathStack.isEmpty()) {
node = pathStack.pop();
if (graph.isNeighbor(currentSrc, node)) {
shortestPathList.add(node);
currentSrc = node;
if (node == source)
break;
}
}
return shortestPathList;
}
ArrayList shortestPathList
只包含一个短路径。我可以修改此BFS以找到所有最短路径或我需要制作另一种算法吗?
答案 0 :(得分:2)
在您的代码中,
if (!visited[v]) {...}
确保你只使用每个v的第一个最短路径。你不需要忽略其他v,而是需要考虑所有这些路径(并且只要路径达到,就需要到达源路径。相同的长度是可能的。)
如果您跟踪来自源的受访节点的最小距离,那么这将找到到达目的地的所有最短路径:
function shortest_paths_to(dest):
if dest == source:
yield path([n])
return
for each vertex n in neighbours(dest):
if distance_from_source(n) < distance_from_source(dest):
for each path p in shortest_paths_to(n):
p.append(dest)
yield p