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 }

浙公网安备 33010602011771号