广度优先搜索:需要多少个顶点状态?

时间:2014-05-13 14:35:51

标签: java algorithm graph breadth-first-search graph-traversal

我正在开展广度优先搜索,我尝试编写BFS来打印所有边缘。第一个版本改编自Algorithm book,其中顶点有3种状态:NOT_VISIT(初始状态),VISIT和PROCESSED。顶点是“访问”'当你第一次看到它。顶点被“处理”'当所有邻居都被访问时。第二个版本是我写的,只使用2个状态:初始状态和VISITED。两者都有效:

public static void BFS(Graph g, int start) {
    boolean[] visit = new boolean[g.size()];
    boolean[] process = new boolean[g.size()];
    List<Integer> queue = new ArrayList<Integer>();
    queue.add(start);
    visit[start] = true;
    while (!queue.isEmpty()) {
        int currentVertex = queue.remove(0);
        process[currentVertex] = true;
        List<Integer> adj = g.getAdjacents(currentVertex);
        if (adj != null) {
            for (Integer i : adj) {
                if (visit[i] == false) {
                    visit[i] = true;
                    queue.add(i);
                }
                if (process[i] == false) {
                    System.out.println(currentVertex + " --- "
                            + i);

                }
            }
        }
    }
}




public static int BFS2(Graph g, int start) {
    List<Integer> queue = new ArrayList<Integer>();
            boolean[] visited = new boolean[g.size()];
    queue.add(start);
    while (!queue.isEmpty()) {
        int v = queue.remove(0);
        visited[v] = true;// only mark visited[v] = true when processing all
                            // its neighbors
        List<Integer> adj = g.getAdjacents(v);
        if (adj != null) {
            for (Integer i : adj) {
                if (!visited[i]) {
                    queue.add(i);
                    System.out.println(v + " --- "
                            + i);
                }
            }
        }
      }
  }

我的问题是:BFS中何时需要有3个状态的顶点?当我们需要3个州时,你能举个例子吗?

1 个答案:

答案 0 :(得分:2)

通常你添加中间状态(在你的情况下为“访问”,在使用颜色标记节点时通常为“灰色”)只是为了可视化BFS的工作方式。在标准实现中,没有必要(您可以在不经过中间状态的情况下切换到“已访问”。)

您可以自己查看,尝试关注BFS(即使是纸和笔,您也可以这样做)。您将看到处于“访问”状态的节点与源距离相等(最大差异为1,具体而言)。出于教育目的,最好对DFS进行相同的操作(这样你就可以观察出广度优先和深度优先搜索之间的区别)。