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.