查找从源到目标的未加权图形中的所有最短路径

时间:2017-05-04 08:53:01

标签: java algorithm graph

我想在未加权的图表中找到所有最短路径。在我的第一次尝试中,我设法找到了使用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以找到所有最短路径或我需要制作另一种算法吗?

1 个答案:

答案 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