<题目链接>
题目大意:
给出青蛙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 ",++ncase); printf("Frog Distance = %.3lf ",dist[2]); } }
2018-08-26