poj 2253 Frogger (最小最大路段)【dijkstra】
<题目链接>
题目大意:
给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B,问从A到B多条路径中最小的最长边。
解题分析:
这是最短路的一类典型题目,与普通的最短路的不同之处在于松弛操作。
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define N 205 int n; struct Node{ int x,y; Node(int _x=0,int _y=0):x(_x),y(_y){} }node[N]; bool vis[N]; double dist[N]; double dis(Node a,Node b){ return (double)sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y)); } void Dij(){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)dist[i]=dis(node[1],node[i]); for(int i=1;i<=n;i++){ int cur;double mn=1e9; for(int j=1;j<=n;j++){ if(!vis[j] && dist[j]<mn) mn=dist[j],cur=j; } vis[cur]=1; for(int j=1;j<=n;j++){ if(!vis[j] && dist[j]>max(dist[cur],dis(node[cur],node[j]))){ //得到最小的最大路段值 dist[j]=max(dist[cur],dis(node[cur],node[j])); } } } } int main(){ int ncase=0; while(scanf("%d",&n)!=EOF,n){ for(int i=1;i<=n;i++){ int u,v;scanf("%d%d",&u,&v); node[i]=Node(u,v); } Dij(); printf("Scenario #%d\n",++ncase); printf("Frog Distance = %.3lf\n\n",dist[2]); } }
2018-08-26
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步