企鹅豆豆即将要去考长跑了,但是作为一只企鹅,长跑自然比不过鸵鸟和鸡。为了公平起见,教练告诉豆豆,他可以从 K 个指定地点中选择两个不同的地点分别作为起点和终点来考试。
考试地图是一个由 N 个点 M 条边组成的没有重边和自环的连通无向图,一条边的长度为 Ai 。
豆豆想知道他的长跑考试最少需要跑多远。
即求一个图中给定点对的最近路径。
题解:
考试的时候乱搞了一个类似SPFA的做法更新每个点的最短路和次短路,感觉数据太水没把我卡掉。。
不得不说这题很妙。
按照k个点的二进制位分组,每次用该位为0的点连接新建的s点,该位为1的点连接新建的t点,跑 logn 次Dijkstra。时间复杂度 O(nlog2n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct IO{
streambuf *ib,*ob;
inline void init(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
ib=cin.rdbuf();ob=cout.rdbuf();
}
inline ll read(){
char ch=ib->sbumpc();ll i=0,f=1;
while(!isdigit(ch)){