我正在使用BFS查找连接的组件。我决定使用一套来跟踪访问过的节点来实现它。该方法的问题是可以将一个顶点添加到队列两次。所以我只是改变了队列设置。我不关心访问顺序,所有节点都访问过一次,算法运行正常。当然,这不再是经典的BFS:订单被打破了。
伪代码:
Set visited;
Set to_visit;
visited.insert(start)
to_visit.insert(start)
while (to_visit is not empty){
current = to_visit.first
to_visit.delete(current)
for each neighbour of current {
isNew = visited.insert(neighbour)
if (isNew) {
to_visit.insert(neighbour)
}
}
}
我很确定我不是第一个发明了#34;"它。我想知道:这个I-dont-care-first搜索是如何调用的?
答案 0 :(得分:1)
如何将它添加到队列中两次?您必须确保队列中的元素是唯一的,如果顶点是对象,则添加标记“visited = false”,当您尝试将顶点添加到队列中时,首先检查标记并仅在其为false时继续,然后将其更改为true。 / p>
如果顶点只是一个数字,那么创建一个表示每个顶点标志的布尔数组。
伪代码:
queue= []
set = [0,0,0,0,0....,0]
queue.push(firstVertex)
while(!queue.isEmpty())
{
vertex curr = queue.pop()
if(set[curr] == 1) //already visited
{
continue;
}
set[curr] = 1;
foreach(child of curr)
{
queue.push(child);
}
}
您还可以将标志从true / false更改为组件数。