POJ 2253 Frogger

这一题跟POJ的heavy transportation 一题正好相反,是求最短路中的边权最长边。用的dijsktra算法,用邻接表存储各边权。

AC code:

 1 #include <iostream>
2 #include <cmath>
3 #include <string.h>
4 #define MAX 1000
5 #define MAXN 100000
6 using namespace std;
7
8 int tmap[MAX][2];
9 float map[MAX][MAX];
10 float dis[MAX];
11 bool vis[MAX];
12 int n;
13
14 float d(int i, int j)//用公式计算两点的距离
15 {
16 float x1, x2, y1, y2;
17 float ans1, ans2;
18 x1 = tmap[i][0];
19 x2 = tmap[j][0];
20 y1 = tmap[i][1];
21 y2 = tmap[j][1];
22 ans1 = pow(x1 - x2, 2) + pow(y1 - y2, 2);
23 ans2 = sqrt(ans1);
24 return ans2;
25 }
26 void ini()
27 {
28 int i, j;
29 memset(tmap, 0, sizeof(tmap));
30 memset(map, 0, sizeof(map));
31 memset(vis, 0, sizeof(vis));
32 for(i = 0; i < n; i++)
33 scanf("%d%d", &tmap[i][0], &tmap[i][1]);
34 for(i = 0; i < n; i++)
35 for(j = i + 1 ; j < n; j++)
36 {
37 map[i][j] = d(i, j);
38 map[j][i] = d(i, j);
39 }
40 }
41
42 int getmin()
43 {
44 int min = MAX;
45 int j;
46 for(int i = 1; i < n; i++)
47 if(!vis[i] &&dis[i] < min)
48 {
49 j = i;
50 min = dis[i];
51 }
52 return j;
53 }
54 float dij()
55 {
56 int i, j;
57 int min_n;
58 for(i = 1; i < n; i++)//对dis初始化
59 dis[i] = map[0][i];
60 vis[0] = true;
61 for(i = 1; i < n; i++){
62 min_n = getmin();//找到最小的dis的下标并把它加入到已生成的路中
63 vis[min_n] = true;
64 for(j = 0; j < n; j++)
65 {
66 if(!vis[j] && map[min_n][j] < dis[j])//更新dis
67 dis[j] = map[min_n][j] > dis[min_n]?map[min_n][j]:dis[min_n];//dis要取最短路中的边权最大的
68 }
69 }
70 return dis[1];//1为终点
71 }
72 int main()
73 {
74 int number = 0;
75 while(scanf("%d", &n)!=EOF && n != 0)
76 {
77 ini();
78 printf("Scenario #%d\n", ++number);
79 printf("Frog Distance = %.3f\n", dij());
80 printf("\n");
81 }
82 return 0;
83 }



posted @ 2012-02-27 21:10  背着超人飞  阅读(175)  评论(0)    收藏  举报