普通01bfs
图里只有两种边权0和1,遍历边权为0的边,队首入队,边权为1队尾入队,做普通bfs
while (队列不为空) {
取出队首U
for (u 的邻居) {
更新距离
if (边权为0)
添加到队首;
else
添加到队尾;
}
}
能否推广只有任意两种边权的图?
如上的逻辑是不行的,不妨修改一下
不妨边权只有a
,b
且(a < b)
创建两个queue<pair<int, int>>
,pair
中存的是出发点到该点距离以及顶点编号。
两个queue
分别是由边权为a
或者b
的边遍历得到的点的集合。(queue中是按距离由小到大排列的,下面证明),更新时,每次取两个queue
队首距离较小的。会出现同一个点出现在两个集合中的情况,舍去大的(由于我们是每次取最小进行更新,那么一定是以该点的最短距离去更新后续的点)
证明:
假设 队列中有两个点,X
和Y
(dist[X] > dist[Y]),由于点X和Y位于同一队列中,那么他们由相同边权a
的边更新得到,不妨X由点A更新,Y由点B更新
$dist[X] > dist[Y], dist[A] + a = dist[X], dist[B] + a = dist[Y]$
可以得出$dist[A] > dist[B]$ 这是矛盾的,因为我们每次是取距离较小的元素进行遍历,Y
在队列中的位置应该在X
前面
再度推广
只要边权的种类有限,便可以采取如是方式
时间复杂度O(V + E)
我是觉得双端队列BFS处理对于动态边权的题时候,边权小的在队头,这样先进先出优先处理总权值的点,有贪心的意思了
为什么没有评论?
我也不知道,对不对我都不清楚