poj2253 Frogger dijkstra

题目大意:

给出n个岛的坐标,前两个坐标分别为A青蛙和B青蛙所在岛的坐标,A青蛙想到达B青蛙所在的岛,A可以从某一个岛跳到任意其它一个岛上,则A到B的每条路径都有一个跳的最远的距离Xi,求这些最远距离中的最小值。

用dijkstra解决,其中dist[J]为起点到J的所有路径中最长边的最小值。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int n, visit[200];
 8 double x[200], y[200];
 9 double G[200][200];
10 double dist[200];
11 const int inf = 2000;
12 
13 void dijkstra() {
14     fill(visit, visit + n, 0);
15     fill(dist, dist + n, inf);
16     dist[0] = 0;
17     for (int i = 0; i < n; i++) {
18         int minn = inf, v;
19         for (int j = 0; j < n; j++) {
20             if (!visit[j] && dist[j] < minn) {
21                 minn = dist[j];
22                 v = j;
23             }
24         }
25         visit[v] = 1;
26         if (v == 1)
27             break;
28         for (int j = 0; j < n; j++) {
29             if (!visit[j])
30                 dist[j] = min(dist[j], max(dist[v], G[v][j]));
31         }
32     }
33 }
34 
35 int main() {
36     int cnt = 0;
37     while (true) {
38         cin >> n;
39         if (n == 0)
40             break;
41         for (int i = 0; i < n; i++)
42             cin >> x[i] >> y[i];
43         for (int i = 0; i < n; i++) {
44             for (int j = 0; j < n; j++)
45                 G[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
46         }
47         dijkstra();
48         printf("Scenario #%d\n", ++cnt);
49         printf("Frog Distance = %.3lf\n\n", dist[1]);
50     }
51     return 0;
52 }

 

posted @ 2019-03-16 21:42  bloglxc  阅读(108)  评论(0编辑  收藏  举报