题意:给定一点到另一点的所有路径中,至少需要跳的最大距离,不是最短路问题,路可以很长,跳的石头很多,要求是跳的最大距离。
用dis数组存储到达每一点至少需要跳的最大距离。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define inf 0x3f3f3f using namespace std; double dis[205], m[205][205]; int vis[205],n; typedef struct { int x,y; } Point; Point a[205]; double distant(Point c1,Point c2) { return sqrt(1.0*(c1.x-c2.x)*(c1.x-c2.x)+1.0*(c1.y-c2.y)*(c1.y-c2.y)); } void dijkstra() { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=(i==1?0:inf); for(int i=1;i<=n;i++) { int x,mi=inf; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]<mi) mi=dis[x=j]; vis[x]=1; for(int k=1;k<=n;k++) dis[k]=min(dis[k],max(dis[x],m[x][k])); } } int main() { int g=0; while(scanf("%d",&n),n) { for(int i=1; i<=n; i++) scanf("%d%d",&a[i].x,&a[i].y); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) m[i][j]=distant(a[i],a[j]); dijkstra(); printf("Scenario #%d ",++g); printf("Frog Distance = %.3f ",dis[2]); printf(" "); } return 0; }