day5
t1 给出一张有n个点m条边的无向图,现在给出起点s和终点t,每个点还存在一个点权,用01表示,询问在起点带的最少的钱,到达终点的前不少于w,每到达一个点,如果当前点权为1,就减少钱1,否则减少钱 \(\lceil \frac{w}{k} \rceil\) ,并且还要求输出字典序最小的路径, \(n\leq 5\times 10^5,m\leq 10^6\) 。 解 法一: 显然刚开始的前,不妨设为 \(e\) ,不好确定,而又具有单调性,因为e增大剩下的前肯定增大,否则减小,于是可以二分确定e,确定了e以后,现在问题就变成找出一条最优秀的路径,这显然是最短路问题,考虑优先队列bfs,因为钱是单调递减的,于是当前的状态能够到达的最优的状态,就是起点能够到达的最优状态,而对于字典序,只要考虑优先队列当中最小的相同的钱所在的点,取字典序最小那个,最终就可以保证路径字典序的最小(所以不能使用 \(A^*\) ),最终时间复杂度为 \(nlog(n)^2\) 。 参考代码 #include <iostream> #include <cstdio> #include <cstring> #define il inline #define ri register #define ll long long #define Size 500500 #define llmax