两个 INF 相加溢出没
运行下面这段程序: #include <algorithm> #include <iostream> #include <queue> #include <set> #include <
补全:写成小根堆
下面的 Dijkstra 用了不带参数的 priority_queue,那是大根堆,先弹出的是最远的点——在这张小图(0-1:10 0-2:1 1-2:1 1-3:1)上结果就错了。补全小根堆的写法,输出距离表。 (本题用 g++ -std
补全:跳过过期的堆元素
同一个点每被改小一次就压一次堆,所以堆里会有「过期」的那一对:弹出来时它的距离已经比 d[u] 大了。补全跳过过期元素的那一行,输出「0 到 4 的距离/扫邻接表的次数」。 (本题用 g++ -std=c++17 -O0 编译。)
补全:INF 取多大才不溢出
这段 Bellman-Ford 用 int 存距离,INF 取了 INT_MAX。从走不到的点松弛出去时,INF + w 会溢出成负数(有符号溢出是未定义行为,本平台 g++ 实际会变成负数),把走不到的点也改成了负数。补全 INF 的取值
补全:距离用 long long
三条边每条长 10 亿,0→1→2→3 总长 30 亿,已经超过了 int 的上限。补全距离数组的类型,输出 0 到 3 的距离。 (本题用 g++ -std=c++17 -O0 编译。)
补全:pair 里谁放前面
pair 比较时先比 first。下面的 Dijkstra 把 {点, 距离} 压进了堆,堆就按点的编号排了——在这张小图(0-1:10 0-2:1 1-2:1 1-3:1)上结果出错。补全堆的类型和压堆、弹堆的写法,输出距离表。 (本题用
为什么要求非负权
第 1 步:从 0 出发:1 号 4,2 号 5 第 2 步:1 号最近,定死;3 号得 5 第 3 步:取出 2 号:走负边到 1 号 第 4 步:1 号改成 2,可它已定死 第 5 步:没人再管 3 号:还是 5 0 1 2 3 d 0
负权边上硬跑会怎样
图里有负权边还硬跑 Dijkstra,结果是【0】。
出现负权该换成什么(C++)
图里确实有负权边时,应该换成【0】。
一个四点的反例
有向图:0→1 长 4、0→2 长 5、2→1 长 -3、1→3 长 1。运行 Dijkstra,看它给出的距离表: #include <algorithm> #include <iostream> #include