BFS最短路径只使用邻接矩阵?

时间:2012-11-15 20:09:16

标签: java algorithm graph-algorithm

我正在尝试使用邻接矩阵来实现Ford-Fulkerson / Edmonds-Karp'。我唯一无法编程的是使用BFS计算最短路径的功能。查看最短路径是否确实存在的功能很好,但是也可以获得最短路径吗?或者是获得最短路径与BFS使用某种父指针,并向后遍历以获取路径的唯一方法?

这是我的代码,用于查看路径是否存在:

public static boolean existsPathFromSourceToSinkInGf(int Gf[][])
{
    LinkedList<Integer> queue = new LinkedList<Integer>();
    queue.add(0);

    while (!queue.isEmpty())
    {
        int v = queue.remove();
        if (v == sink) return true;
        for (int i = 0; i < 5; i++)
        {

            if (Gf[v][i] != 0)
            {
                if (!queue.contains((Integer)i))
                {
                    queue.add((Integer)i); 
                }
            }
        }
    }

    return false;

  }

1 个答案:

答案 0 :(得分:1)

执行此操作的常用方法确实是每次结算节点时保持父指针,并在找到路径后返回。

您还可以在队列中明确跟踪路径。您可以创建自己的类,而不是仅为链接列表使用整数,该类包含整数和字符串,类似于“节点1-&gt;节点3-&gt; ...”。由于类和路径的开销,它不太常用,但它避免了必须自己保持父指针并最终必须遍历它们。

在附注2上对你的代码的评论:

  1. 为什么它会运行i = 0..5?
  2. 您检查if (!queue.contains((Integer)i)),这样您就不会在队列上放置一个已经在其上的顶点。您还应该避免在已经从列表中删除的顶点上放置顶点(尝试维护一组访问过的节点)。