AcWing340. 通信线路

AcWing340. 通信线路_第1张图片

输入样例:

5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6

输出样例:

4

 解析:

        答案满足单调性,所以二分。

        在check每个mid的时候,因为大于mid的边肯定不存在或者免费,所以在求最短路的时候记录大于mid的边的数量,返回 mid<=k 即可。

        Dijkstra

#include
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1010;
struct edge{
	int to,w;
	edge(int a,int b):to(a),w(b){}
};
struct node{
	int id,dis;
	node(int a,int b):id(a),dis(b){}
	bool operator<(const node &a)const{
		return dis>a.dis;
	}
};
int n,p,k,maxx; 
vectore[N];
bool check(int mid){
	int s=1,dis[N],done[N];		//s为起点 
	for(int i=1;i<=n;i++)	dis[i]=INF,done[i]=0;
	dis[s]=0;
	priority_queueq;
	q.push(node(s,dis[s]));
	while(!q.empty()){
		node u=q.top();
		q.pop();
		if(done[u.id]==1) continue;
		done[u.id]=1;
		for(int i=0;imid;
			if(dis[x.to]>temp+u.dis){
				dis[x.to]=temp+u.dis;
				q.push(node(x.to,dis[x.to]));
			}
		}
	}
	return dis[n]<=k;
}
int main(){
	scanf("%d%d%d",&n,&p,&k);
	for(int i=0;i>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	if(l==maxx+1) cout<<-1;
	else cout<

你可能感兴趣的:(AcWing,算法,c++,数据结构,Dijkstra,二分法)