码迷,mamicode.com
首页 > 其他好文 > 详细

poj2253 最短路

时间:2015-07-21 01:14:25      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

题意:青蛙跳石头,给出石头的坐标,然后要确定一条路径,使路径上的最大跨度最小,其实也是一道最短路问题,只要将更新条件从总距离最短改为最大跨度最小就行,即从某点到当前点路径上的最大跨度如果小于当前点原本记录下的最大跨度,或当前点还没有被访问过,无最大跨度,那么就更新它,然后以此为条件跑dij或者spfa就行了

dij:

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<math.h>
 7 #define max(a,b) a>b?a:b
 8 using namespace std;
 9 typedef pair<double,int> pii;
10 const double INF=100000.0;
11 
12 int n;
13 
14 struct point{
15     int x,y;
16 }p[205];
17 
18 double g[205][205],dist[205];
19 
20 struct cmp{
21     bool operator()(pii a,pii b){
22         return a.first>b.first;
23     }
24 };
25 
26 void dij(int s,int p){
27     int i;
28     for(i=1;i<=n;i++){
29         dist[i]=INF;
30     }
31     dist[s]=0;
32     priority_queue<pii,vector<pii>,cmp>q;
33     q.push(make_pair(0,s));
34     while(!q.empty()){
35         pii u=q.top();
36         q.pop();
37         if(u.first>dist[u.second])continue;
38         for(i=1;i<=n;i++){
39             double j=max(u.first,g[u.second][i]);
40             if(i!=u.second&&dist[i]>j){
41                 dist[i]=j;
42                 q.push(make_pair(dist[i],i));
43             }
44         }
45     }
46     printf("%.3lf\n\n",dist[p]);
47 }
48 
49 int main(){
50     int c=0;
51     while(scanf("%d",&n)!=EOF&&n!=0){
52         int i,j;
53         for(i=1;i<=n;i++){
54             scanf("%d%d",&p[i].x,&p[i].y);
55             for(j=1;j<=i;j++){
56                 g[i][j]=g[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)*1.0+(p[i].y-p[j].y)*(p[i].y-p[j].y)*1.0);
57             }
58         }
59         printf("Scenario #%d\nFrog Distance = ",++c);
60         dij(1,2);
61     }
62     return 0;
63 }
dij

 

spfa:

技术分享
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 #include<math.h>
 5 #define max(a,b) a>b?a:b
 6 const double INF=10000.0;
 7 using namespace std;
 8 
 9 struct point{
10     int x,y;
11 }p[205];
12 
13 double g[205][205],dist[205];
14 bool vis[205];
15 int n;
16 
17 void spfa(int s,int p){
18     int i;
19     for(i=1;i<=n;i++){
20         dist[i]=INF;
21     }
22     memset(vis,0,sizeof(vis));
23     dist[s]=0;
24     queue<int>q;
25     q.push(s);
26     vis[s]=1;
27     while(!q.empty()){
28         int u=q.front();
29         q.pop();
30         vis[u]=0;
31         for(i=1;i<=n;i++){
32             double j=max(dist[u],g[u][i]);
33             if(i!=u&&dist[i]>j){
34                 dist[i]=j;
35                 if(!vis[i]){
36                     q.push(i);
37                     vis[i]=1;
38                 }
39             }
40         }
41     }
42     printf("%.3lf\n\n",dist[p]);
43 }
44 
45 int main(){
46     int c=0;
47     while(scanf("%d",&n)!=EOF&&n!=0){
48         int i,j;
49         for(i=1;i<=n;i++){
50             scanf("%d%d",&p[i].x,&p[i].y);
51             for(j=1;j<=i;j++){
52                 g[i][j]=g[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)*1.0+(p[i].y-p[j].y)*(p[i].y-p[j].y)*1.0);
53             }
54         }
55         printf("Scenario #%d\nFrog Distance = ",++c);
56         spfa(1,2);
57     }
58     return 0;
59 }
spfa

 

poj2253 最短路

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4663167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!