题型一:
边
权
均
为
1
,
求
解
s
到
t
的
最
短
路
边权均为1,求解s到t的最短路
边权均为1,求解s到t的最短路
普
通
B
F
S
,
复
杂
度
为
O
(
∣
V
∣
+
∣
E
∣
)
普通BFS,复杂度为O(|V|+|E|)
普通BFS,复杂度为O(∣V∣+∣E∣)
证
明
:
q
u
e
u
e
维
护
一
个
d
i
s
单
调
不
减
的
序
列
,
更
准
确
地
说
队
列
存
储
的
是
一
群
a
+
一
群
(
a
+
1
)
,
动
动
脑
筋
就
知
道
为
什
么
了
证明:queue维护一个dis单调不减的序列,更准确地说队列\\存储的是一群a+一群(a+1),动动脑筋就知道为什么了
证明:queue维护一个dis单调不减的序列,更准确地说队列存储的是一群a+一群(a+1),动动脑筋就知道为什么了
有
了
这
个
性
质
,
我
们
就
可
以
根
据
d
p
的
思
想
,
发
现
距
离
为
1
的
状
态
为
最
优
状
态
,
推
出
距
离
为
2
的
状
态
也
为
最
优
状
态
,
即
一
旦
加
入
队
列
,
该
元
素
的
最
优
值
已
被
确
定
!
有了这个性质,我们就可以根据dp的思想,发现距离为1的\\状态为最优状态,推出距离为2的状态也为最优状态,即一\\旦加入队列,该元素的最优值已被确定!
有了这个性质,我们就可以根据dp的思想,发现距离为1的状态为最优状态,推出距离为2的状态也为最优状态,即一旦加入队列,该元素的最优值已被确定!
题型二:
边
权
为
非
负
数
,
求
解
s
到
t
的
最
短
路
边权为非负数,求解s到t的最短路
边权为非负数,求解s到t的最短路
B
F
S
+
优
先
队
列
,
复
杂
度
为
O
(
(
∣
V
∣
+
∣
E
∣
)
∗
l
o
g
)
BFS+优先队列,复杂度为O((|V|+|E|)*log)
BFS+优先队列,复杂度为O((∣V∣+∣E∣)∗log)
证
明
:
p
r
i
o
r
i
t
y
_
q
u
e
u
e
维
护
一
个
d
i
s
单
调
不
减
的
序
列
,
如
果
其
中
有
一
个
点
进
行
了
扩
展
,
那
么
该
点
就
不
可
能
再
被
更
新
d
i
s
(
由
于
边
权
非
负
以
及
d
i
s
单
调
不
减
)
,
因
此
可
以
推
出
最
多
有
∣
V
∣
个
点
会
进
行
扩
展
即
O
(
∣
E
∣
∗
l
o
g
)
证明:priority\_queue维护一个dis单调不减的序列,如果\\其中有一个点进行了扩展,那么该点就不可能再被更新dis\\(由于边权非负以及dis单调不减),因此可以推出最多\\有|V|个点会进行扩展即O(|E|*log)
证明:priority_queue维护一个dis单调不减的序列,如果其中有一个点进行了扩展,那么该点就不可能再被更新dis(由于边权非负以及dis单调不减),因此可以推出最多有∣V∣个点会进行扩展即O(∣E∣∗log)
题型三:
边
权
为
0
或
1
,
求
解
s
到
t
的
最
短
路
边权为0或1,求解s到t的最短路
边权为0或1,求解s到t的最短路
B
F
S
+
d
e
q
u
e
,
复
杂
度
为
O
(
∣
V
∣
+
∣
E
∣
)
BFS+deque,复杂度为O(|V|+|E|)
BFS+deque,复杂度为O(∣V∣+∣E∣)
证
明
:
显
然
维
护
的
队
列
元
素
对
应
的
距
离
只
有
两
种
值
,
于
是
直
接
b
f
s
即
可
,
如
果
遇
到
边
权
为
0
,
则
把
放
到
双
端
队
列
前
面
,
否
则
放
到
后
面
,
这
样
依
旧
可
以
保
证
队
列
只
有
两
种
d
i
s
值
。
证明:显然维护的队列元素对应的距离只有两种值,于是直接bfs\\即可,如果遇到边权为0,则把放到双端队列前面,否则\\放到后面,这样依旧可以保证队列只有两种dis值。
证明:显然维护的队列元素对应的距离只有两种值,于是直接bfs即可,如果遇到边权为0,则把放到双端队列前面,否则放到后面,这样依旧可以保证队列只有两种dis值。