UVA534 Frogger (dijkstra)

题目链接:https://www.luogu.com.cn/problem/UVA534

 

题目大意:求路径中最长的石头间隔最小是多少

 

方法:Dijkstra改变判断条件,d数组改变含义,d[i]为从起点到i路径中最小的间隔

 

示例代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <map>
 7 #include <queue>
 8 #include <cmath>
 9 using namespace std;
10 #define int long long
11 #define N 4010
12 #define P pair<double,int>
13 #define mp make_pair
14 struct node {double x,y;} a[210];
15 double m[210][210],d[210];
16 int n,v[210];
17 double dis(int i, int j) {
18     return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
19 }
20 signed main() {
21     int tot = 0;
22     while(~scanf("%d",&n) && n) {
23         memset(m,0,sizeof(m));
24         for(int i = 0; i < 210; i++) d[i] = 3000.0;
25         memset(v,0,sizeof(v));
26         for(int i = 1; i <= n; i++) 
27             scanf("%lf%lf",&a[i].x,&a[i].y);
28         for(int i = 1; i <= n; i++) 
29             for(int j = i+1; j <= n; j++) 
30                 m[j][i] = m[i][j] = dis(i,j);
31         priority_queue<P> q;
32         q.push(mp(0,1)); d[1] = 0;
33         while(!q.empty()) {
34             int u = q.top().second; q.pop();
35             if(v[u]) continue;
36             v[u] = 1;
37             for(int i = 1; i <= n; i++) {
38                 if(i == u) continue;
39                 if(!v[i] && max(d[u],m[u][i]) < d[i]) {
40                     d[i] = max(d[u],m[u][i]);
41                     q.push(mp(-d[i],i));
42                 }
43             }
44         }
45         printf("Scenario #%d\n",++tot);
46         printf("Frog Distance = %.3f\n\n",d[2]);
47     }
48     return 0;
49 } 

 

posted @ 2021-03-13 15:00  不敢说的梦  阅读(43)  评论(0)    收藏  举报