题目:
题解:
本来以为是一道sb题然后WA过了才知道是大神题。。。
到达一个点有三种走法(窝一开始以为是两种)
1、一步步走a到达
2、当b < 2a,可以把两条a缩成一条b,如果是奇数就先走a
3、当b < a,这是一种很奇怪的走法,可以通过走更多的边数来换取较少的距离
比如这个图,到达A可以走a+b,也可以走2b
我们首先考虑暴力,就是当枚举到一个点,首先一边遍历与他相邻的点,对于这些点再二次遍历相邻的点,这次相邻的点可以用这个枚举点+b的长度更新
当然这样是过不去的,我们还需要优化。
首先每个点只会被更新一次,只有被更新点才有机会继续更新别的点。被更新一次是必然的,不然形成一个更新环就GG了
然后对于一组点A-x-y,可能会经历这样的过程,更新了y之后y入队,y反向边找到x,x又找到y,诚然这不会让答案错误,但是速度会慢,M^2的效率,我们可以考虑在更新的y之后把x-y这条边删掉,这样就不会进一步无用枚举了
代码:
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
using