BFS

1,为什么bfs要用到队列。

2,对于你可以遍历到的所有状态,先把他们加到一个队列中,然后再去遍历他们。

3,简单说就是先mark,然后在遍历。

4,代码框架

void bfs()
{
    push(..)//把起始状态入队列
    while(!empty()){//当队列不为空时候
    x=pop();
    for(...)
{}//遍历此状态可到达的状态
push(...)//后续状态入队
    
    
    }


}

 5,bfs有一个有用的特点,即逐层扩展

若任意两个状态间转移的代价都相同,

那么bfs第一次访问到目标状态时时从起始状态到目标状态的最小代价的

(因为没有切身体会,所以感受不是很深)

例如在网格图中求单源最短路,只需要从源点开始逐层扩展。。

啥啥的。。以后再说把

6,与其说染色,不如说特殊点的记忆化。

7,呵呵,要不思考放晚上把。。

二,BFS拓展

1,先从定义开始,只有当状态两两之间相互转移的代价相同时,才能以第一次遍历到

目标状态的代价作为最小代价

(坦白说,不骗你自己,我确实不是很懂,其实但是i要是根据下01迷宫马的遍历的各种题的话,就比如马的遍历,只要能走,并没有代价,都是日字走法,但是换个角度,不就是大家走的代价一样嘛,哦哦,这样倒是有些了解了)

2,由定义引出来,那么代价不相同呢?

就会有两条路可以走,

 ①是使用优先队列,就是每次从队列中取出的是代价最小的那个。

他说就是堆优化的迪杰算法。我倒不是很懂。

②是允许反复进队,第二次更新到该状态的话,如果代价更小的话则更新次状态并再次进队

但是碰上“好”的数据会re,tle.

(比如某个点让你反复进队,设计好的)

原文地址:https://www.cnblogs.com/beiyueya/p/12005607.html