单源最短路算出的是什么
跑完一次单源最短路,直接得到的是【0】。
两种走法各要走多远
从 0 号到 4 号有两条路:0-2-4(只走 2 段)和 0-1-3-4(走 3 段)。各段长度是 0-1:2 0-2:1 1-3:3 2-4:9 3-4:1。运行下面这段程序,看两条路各多长: #include <algorith
Dijkstra 每一轮做什么
第 1 步:起点 0:距离 0 第 2 步:松弛 0 的边:得 2 和 1 第 3 步:取出最近的 2 号 第 4 步:再取 1 号:3 号变成 5 第 5 步:取 3 号:4 号改小成 6 第 6 步:全部定死,最短距离到手 0 1 3
为什么取出来就能定死(C++)
Dijkstra 取出一个点后就不再改它,因为【0】。
靠什么快速取最近的点
Dijkstra 通常用【0】来取当前最近的点。
从堆里弹出来先检查什么
从优先队列弹出一个点,第一件事是【0】。
从 0 到各点的最短距离
七个点的带权图,走不到的记 -1。运行下面这段程序: #include <algorithm> #include <iostream> #include <queue> #include <set&
写一个 Dijkstra
补全 dijkstra:用小根堆,弹出时先跳过已经处理过的点,再松弛它的每条边。 (本题用 g++ -std=c++17 -O0 编译。)
把最短路径还原出来
补全 back_track:dij_path 在松弛成功时已经记下了父亲 par[v] = u,从终点倒着回溯就是路径。输出 0 到 4 的路径(用 - 连)。 (本题用 g++ -std=c++17 -O0 编译。)
最短的路和最少的步
算出 0 到 4 的带权最短路,再和步数最少那条(0-2-4)比一比。输出三样:最短总长 / 它走了几条边 / 步数最少那条的总长。 (本题用 g++ -std=c++17 -O0 编译。)