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.
(比如某个点让你反复进队,设计好的)