我正在开展广度优先搜索,我尝试编写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个州时,你能举个例子吗?
答案 0 :(得分:2)
通常你添加中间状态(在你的情况下为“访问”,在使用颜色标记节点时通常为“灰色”)只是为了可视化BFS的工作方式。在标准实现中,没有必要(您可以在不经过中间状态的情况下切换到“已访问”。)
您可以自己查看,尝试关注BFS(即使是纸和笔,您也可以这样做)。您将看到处于“访问”状态的节点与源距离相等(最大差异为1,具体而言)。出于教育目的,最好对DFS进行相同的操作(这样你就可以观察出广度优先和深度优先搜索之间的区别)。