P1396 营救 题解
分析
这题有好几种方法可以做,有跑最短路的,有些最小生成树的。这里介绍最短路的方法。
单源最短路径,很自然地想到 Dijkstra。不过题目要求的是最大值最小,所以松弛就要改成:
if(dis[v]>max(dis[u],e[i].w)) dis[v]=max(dis[u],e[i].w);
代码实现
#include <bits/stdc++.h> using namespace std; int n,m,s,t; struct edge{ int to,nxt,w; }e[(int)2e4<<1]; int head[10005],idx; void link(int x,int y,int w){ e[++idx]={y,head[x],w}; head[x]=idx; } struct poi{ int d,p; bool operator<(const poi&x)const{return d>x.d;} }; priority_queue<poi>q; int dis[10005]; bool vis[10005]; int main(){ cin>>n>>m>>s>>t; for(int i=1,x,y,z;i<=m;i++){ cin>>x>>y>>z; link(x,y,z); link(y,x,z); } memset(dis,0x3f3f3f3f,sizeof(dis)); dis[s]=0; q.push(poi{0,s}); while(!q.empty()){ int u=q.top().p;q.pop(); if(vis[u])continue; vis[u]=true; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(dis[v]>max(dis[u],e[i].w)){ dis[v]=max(dis[u],e[i].w); q.push(poi{dis[v],v}); } } } cout<<dis[t]; return 0; }
本文作者:tmjyh09
本文链接:https://www.cnblogs.com/tmjyh09/p/15831953.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步