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

地铁修建

  • 常规的最短路问题为:
    (1)询问 1 − n 1-n 1n路径长度的最小值
    (2) d i s [ x ] dis[x] dis[x]表示 1 − x 1-x 1x的距离
    (3)松弛条件为 d i s [ y ] > d i s [ x ] + w dis[y]>dis[x]+w dis[y]>dis[x]+w
  • 本题为最短路变形问题:
    (1)询问 1 − n 1-n 1n经过的边权最大值的最小值
    (2) d i s [ x ] dis[x] dis[x]表示 1 − x 1-x 1x边权最大值的最小值
    (3)松弛条件为 d i s [ y ] > m a x ( d i s [ x ] , w ) dis[y]>max(dis[x],w) dis[y]>max(dis[x],w)
  • 无向图,注意边数的最大取值
#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(CCF,CSP,认证)