知识点:广搜
上一个BFS蓝题练习了方向处理,地图的状态处理,输出任意一条最短路,这个题练习了不一样的东西,是输出一条有第二标尺的最短路,那么原先记录任意最短路径的方法就不适用,这里采用了两个BFS的写法,之所以这么写,是利用了BFS的队列里面的状态是关于层次具有两段性的这么一个性质,首先第一个广搜我们用来找最短路路径的长度,做好标记,并且是反向搜索,从终点到起点,为什么要这样,应该是为了能把所有的最短路径给包含进来,为了下一个找路径
重点是第二个BFS,我们从起点开始搜,每次都要找距离减一的节点,同时,我们要保证,我们的队列里面的节点是单一的,也就是说,我们一次放,就放进来一层的节点,出也出一层的节点,时刻保持队列里面只有一层而不是两层的节点,一层一层的处理,因为我们是要找当前层到下面一层路径最短的节点,如果队列里面混有两层的节点显然是不行的,所有我们需要辅助的队列,首先第一次循环找出边权的最小值,输出答案,第二次循环,找出所有边权是最小值的下一层的节点,这里注意要判重,每个节点入队一次就行了,这样,就做到了一层一层的搜,当然这个也可以用vector来模拟这个队列,但是我为了使程序含义更明显,还是用了队列来做
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, tot, ver[N * 4], edge[N * 4],