CCF CSP 201703-4 地铁修建【Dijkstra】

本文探讨了地铁修建中的一种特殊最短路径问题,即寻找从起点到终点路径上边权最大值最小的路径。通过使用Dijkstra算法的变形,实现了在无向图中求解这一问题,并给出了具体的C++实现代码。

地铁修建

  • 常规的最短路问题为:
    (1)询问1−n1-n1n路径长度的最小值
    (2)dis[x]dis[x]dis[x]表示1−x1-x1x的距离
    (3)松弛条件为dis[y]>dis[x]+wdis[y]>dis[x]+wdis[y]>dis[x]+w
  • 本题为最短路变形问题:
    (1)询问1−n1-n1n经过的边权最大值的最小值
    (2)dis[x]dis[x]dis[x]表示1−x1-x1x边权最大值的最小值
    (3)松弛条件为dis[y]>max(dis[x],w)dis[y]>max(dis[x],w)dis[y]>max(dis[x],w)
  • 无向图,注意边数的最大取值
#include<iostream>
#include<algorithm>
#include<limits.h>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e5+10,inf=INT_MAX,M=2e5+10;
int n,m,tot,head[N],vis[N],dis[N]; 
struct Edge{
	int to,next,w;
}e[2*M];
priority_queue<pair<int,int>> q;
void add(int x,int y,int w){
	e[++tot].to=y;
	e[tot].w=w;
	e[tot].next=head[x];
	head[x]=tot;
} 
void dijkstra(int s){
	while(q.size())q.pop();
	memset(vis,0,sizeof vis);
	for(int i=1;i<=n;i++) dis[i]=inf;
	dis[s]=0;
	q.push({0,s});
	while(q.size()){
		int x=q.top().second;q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i;i=e[i].next){
			int y=e[i].to,w=e[i].w;
			if(dis[y]>max(dis[x],w)){
				dis[y]=max(dis[x],w);
				q.push({-dis[y],y}); //大根堆变小根堆,取负数 
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int u,v,w,i=1;i<=m;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w); 
	}
	dijkstra(1);
	cout<<dis[n]<<endl;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值