1 /*
2 题意:给出N个石头的坐标,2只frog分别在1号和2号石头上,要从1号跳到2号石头上,每一次跳的距离
3 不能太远,因此要借助剩余N-2个石头跳,选择一条路径使得这条路径上的最长距离的一跳最短。
4
5 题解:最短路变形,dijkstra实现
6 只需在最短路的判定过程中记录当前的最长的边而不是总距离即可实现
7 */
8 #include <cstdio>
9 #include <algorithm>
10 #include <cmath>
11 #include <cstring>
12
13 double map[205][205];
14 double dist[105];
15 bool vis[105];
16
17 int n;
18
19 struct node
20 {
21 double x,y;
22 }s[205];
23
24 void dijkstra()//迪杰斯特拉算法求最短路
25 {
26 int i,j;
27 int node,sd;
28 for(i=1; i<=n; i++)
29 dist[i] = map[1][i];
30 memset(vis,false,sizeof(vis));
31 for(i=1; i<=n; i++)
32 {
33 node = 0;
34 sd = 1e10;
35 for(j=1; j<=n; j++)
36 {
37 if (!vis[j] && sd>dist[j])//找出未访问的点中路径最短的点并赋给node
38 {
39 sd = dist[j];
40 node = j;
41 }
42 }
43 if (node == 0)//当点已经遍历完,break;
44 break;
45 vis[node] = true;
46 for(j=1; j<=n; j++)
47 // 判定通过node点到达j的路径中最长边是否小于原先的最长边
48 if (!vis[j] && map[node][j]>0 && dist[j]>dist[node] && dist[j]>map[node][j])
49 //以node为基点对其它未访问的点进行松弛
50 dist[j] = std::max(dist[node],map[node][j]); // 此处注意是max,因为是求最长边
51 }
52 }
53
54 double getdis(node a, node b)
55 {
56 return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
57 }
58
59 int main(void)
60 {
61 int cas = 1;
62 while (~scanf("%d",&n) && n)
63 {
64 for(int i=0; i<=n; i++)
65 for(int j=0; j<=n; j++)
66 if (i != j)
67 map[i][j] = 1e10;
68 for(int i=1; i<=n; i++)
69 {
70 scanf("%lf%lf",&s[i].x,&s[i].y);
71 map[i][i] = 0;
72 }
73
74 for(int i=1; i<n; i++)
75 for(int j=i+1; j<=n; j++)
76 map[i][j] = map[j][i] = getdis(s[i],s[j]);
77 dijkstra();
78 printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cas,dist[2]);
79 cas++;
80 }
81 return 0;
82 }