默认的优先队列先出谁

第 1 步:堆里先放 (0,0) 第 2 步:弹出 0,压进 (1,2)(2,1) 第 3 步:弹出 2,压进 (10,4) 第 4 步:弹出 1,压进 (5,3) 第 5 步:弹出 3,压进 (6,4) 第 6 步:(10,4) 过期了:

开始练习 →

写成小根堆要加什么

要让 priority_queue 先弹出距离最小的一对,模板的第三个参数写【0】。

开始练习 →

INF 为什么常取这个数

写 C++ 最短路时 INF 常取 0x3f3f3f3f(约 10 亿),主要因为【0】。

开始练习 →

默认堆的弹出顺序

运行下面这段程序: #include <algorithm> #include <iostream> #include <queue> #include <set> #include <

开始练习 →

两个 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)上结果出错。补全堆的类型和压堆、弹堆的写法,输出距离表。 (本题用

开始练习 →