POJ_2253 Frogger 最短路变形
Posted dybala21
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ_2253 Frogger 最短路变形相关的知识,希望对你有一定的参考价值。
一、题目
二、分析
题意关键点就是那个青蛙距离。就是所有1到2的点的路径中,每条路径都可以确定一个最大值,这个最大值就是青蛙要跳的青蛙距离,然后要求这个青蛙距离最小值。
其实就是最短路的变形,用dijkstra,原先求最短路的时候是每次确定当前最小距离的点,那么,这题只需要每次确定一个当前最有值就可以了,易证,队列后面的值是不会有更小了的。
三、AC代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <queue> 6 #include <fstream> 7 using namespace std; 8 #define INF 0x3f3f3f3f 9 typedef pair<double, int> P; 10 const int MAXN = 2e2 + 14; 11 struct point 12 13 int x, y; 14 node[MAXN]; 15 struct cmp 16 17 bool operator()(const P &a, const P &b) 18 19 return a.first > b.first; 20 21 ; 22 int n; 23 double G[MAXN][MAXN]; 24 double dist[MAXN]; 25 bool flag[MAXN]; 26 27 void Dijkstra(int s) 28 29 priority_queue<P, vector<P>, cmp> pq; 30 memset(dist, 0, sizeof(dist)); 31 memset(flag, 0, sizeof(flag)); 32 pq.push(P(0, 1)); 33 while( !pq.empty() ) 34 35 P t = pq.top(); 36 pq.pop(); 37 int v = t.second; 38 if(flag[v]) 39 continue; 40 flag[v] = 1; 41 dist[v] = t.first; 42 for(int i = 1; i <= n; i++) 43 44 if(!flag[i]) 45 46 double m = max(dist[v], G[v][i]); 47 pq.push(P(m, i)); 48 49 50 51 52 53 54 55 double calc(point a, point b) 56 57 double ans; 58 double x = a.x - b.x; 59 double y = a.y - b.y; 60 ans = sqrt(x*x + y*y); 61 return ans; 62 63 64 65 int main() 66 67 //freopen("in.txt", "r", stdin); 68 int Case = 1; 69 while(scanf("%d", &n) != EOF) 70 71 if(n == 0) 72 break; 73 if(Case != 1) 74 puts(""); 75 for(int i = 1; i <= n; i++) 76 77 scanf("%d%d", &node[i].x, &node[i].y); 78 79 for(int i = 1; i <= n; i++) 80 81 for(int j = i+1; j <= n; j++) 82 83 G[i][j] = calc(node[i], node[j]); 84 G[j][i] = G[i][j]; 85 86 G[i][i] = 0; 87 88 Dijkstra(1); 89 printf("Scenario #%d\n", Case++); 90 printf("Frog Distance = %.3f\n", dist[2]); 91 ; 92 return 0; 93
以上是关于POJ_2253 Frogger 最短路变形的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2253 Frogger(Dijkstra变形——最短路径最小权值)
[ACM] POJ 2253 Frogger (最短路径变形,每条通路中的最长边的最小值)