使用set而不是queue来进行广度优先搜索

时间:2016-07-30 22:32:39

标签: graph breadth-first-search

我正在使用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搜索是如何调用的?

1 个答案:

答案 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更改为组件数。