zoukankan      html  css  js  c++  java
  • 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
    
    ",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
    Frog 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
    
    ",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
    Frog Distance = ",++c);
    56         spfa(1,2);
    57     }
    58     return 0;
    59 }
    spfa
  • 相关阅读:
    vue2.0阻止事件冒泡
    IconFont 图标制作和使用
    Gulp入门教程
    伪类实现特殊图形,一个span加三角形
    Vue渲染列表,在更新data属性后,列表未更新问题
    理解Array.prototype.slice.call(arguments)
    ;(function(){ //代码})(); 自执行函数开头为什么要加;或者!
    Hexo 搭建博客 本地运行 常见报错及解决办法
    说说JSON和JSONP,也许你会豁然开朗
    数组去重的常用方法
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4663167.html
Copyright © 2011-2022 走看看