01BFS
        
        
            学不会的BFS,神仙建图
干啥的
用来解决:边权值为 
在 bfs 的基础上做如下改动:
- 用 deque取代queue
- 边权为 时,从双端队列的前端插入;边权为 时,从双端队列的后端插入。 
悟悟悟
例1
Eva.oj 0005
给一个 . 代表道路,# 代表墙 ,求从 
解1
技巧:拆点。把每一个点拆成水平方向和垂直方向的两个点。
依次给拆开的点编号。先存水平方向的,再存垂直方向的,水平点之间的边和垂直点之间的边边权为 
水平方向的点用 ida(int x, int y) 计算编号,依次从 
垂直方向的点用 idb(int x, int y) 计算编号,依次从 
pair(int a, int b) :a 代表点的编号,b 代表边权 。
再连接同一个点的水平点和垂直点,边权为 
e[N * N * 2] 邻接表。
dis[N * N * 2] 存放距离。
| 1 | 
 | 
练练练
例1
Wizard in Maze
https://atcoder.jp/contests/abc176/tasks/abc176_d
给一个无向图,. 代表道路 # 代表墙。有两种移动方法:
- 向上下左右走,代价为 
- 使用一次魔法,可以任意移动到以该点为中心的 5*5的矩阵中的任意一点,代价为
给定起点和终点,问从起点运动到终点所需代价最小为多少。
解1
我们先将起点放入队列中,依次扫描跟起点相连的点(上下左右,和 5*5 矩阵里的点),当 dis 能被更新时,就更新。更新以后放入队列。
这里为什么不开 vis 呢??
因为有可能出现以下情况:队列里的两个点 vis 打标记的话,它最终会从 
| 1 | 
 | 
例2
- Post title:01BFS
- Post author:Eva.Q
- Create time:2021-08-24 23:08:05
- Post link:https://qyy/2021/08/24/Algorithm/ColinClass6/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.