最近开始练图论了,跟蓝书刷起来。
题意:
在无向图上求出一条从1到N的路径,使得路径上第K+1大的边权尽量小。
数据范围:N,K1e3,P(边)1e4
思路:
由于答案具有单调性,即付钱少的方案一定被包含在付钱多的方案内,则二分答案,把问题转化为:是否存在一种合法的升级方法,使花费不超过mid。
判定只需在做最短路的时候把边权大于mid的边边权变为1,不超过mid的边权为0,看1到n最短路是否超过K即可。0到1e6二分就可求出答案。
代码:
#include <cstdio>
#include <iostream>
#include <memory>
#include <queue>
using namespace std;
const int N=100010,M=1000010;
int head[N],ver[M],edge[M],Next[M],d[N];
bool v[N];
int n,m,tot;
priority_queue< pair<int,int> > q;
int mid;
void add(int