poj2253 最短路

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

 

你可能感兴趣的:(poj)