kuangbin專題專題四 Frogger POJ - 2253

 

題目連接:https://vjudge.net/problem/POJ-2253

思路:ios

從一號到二號石頭的全部路線中,每條路線中都個子選出該路線中兩點通路的最長距離,並在這些選出的最長距離選出最短路的那個距離X,算法

就是青蛙距離,即青蛙至少能跳X米,才能安全的到達二號,由於什麼,再看看第一句話。數組

再想,咱們知道,djikstra中的價值數組存的是從u點到其餘全部點的最短距離,way[ 1 ] 是u到1的最短距離, way[ x ] 是u到x的最短距離,安全

咱們知道djikstra的時間複雜度是O(n^2),這個時間複雜是是由於咱們訪問了全部的從一個城市出發到其餘城市全部狀況(除去已經最優的城市),優化

有n個城市,去其餘(除去最優)的個城市,全部比較次數能夠用接近(n^2)表示。spa

我爲何要說這個呢,我只想表達。。。我只是想強調dijstra保存了最優路線和不肯定路線的價值,訪問了其餘不肯定的路線去更新不肯定價值的路線,.net

慢慢獲得全部最優路線。code

那麼,咱們可不能夠把這個價值數組利用在這個題目上,改變維護方式呢?blog

咱們能夠這麼想題目意思,價值數組只存一條路線,那麼它必定存的是到該城市的最長距離,而後,咱們須要把這個最長距離儘量變小,即最小化最大距離。ip

那麼咱們就能夠用dijkstra算法來求這個問題,那咱們須要怎麼維護。

(1):首先,價值數組初始化同樣。

(2):咱們須要找出最小的價值數組,爲何?(裏面存的是起始點到該點的全部路線中最小化的最大距離)

(3):咱們找出了最小的價值數組,即獲得了城市編號,那麼,咱們用該點去訪問其餘不肯定的城市。

(4): 維護方法 :way[ k ] > max( dis[ x ][ k ], way[ x ] ),  max( dis[ x ][ k ], way[ x ] )表示,從起始點到x點全部路線的的最小化的最大距離和x到k的距離選出最大的和

從起始點到k點部分路線的的最小化的最大距離比較,若是k點的從起始點到k點部分路線的的最小化的最大距離比從起始點到x點全部路線的的最小化的最大距離和x到k的距離選出最大的

的大,說明k能夠被優化,那麼  :way[ k ] =max( dis[ x ][ k ], way[ x ] ),  max( dis[ x ][ k ], way[ x ] )。

(5):直到最後獲得從起始點到其餘全部點的最小化最大距離。

( 代碼就不加上註釋了,只要上面的理解了,代碼很容易理解 )

這個題目在思惟上仍是有點難的,能夠慢慢理解。


  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <string>
  6 #include <cmath>
  7 #include <iomanip>
  8 using namespace std;
  9 
 10 typedef long long LL;
 11 #define inf (1LL << 30) - 1
 12 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
 13 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
 14 #define per(i,j,k) for(int i = (j); i >= (k); i--)
 15 #define per__(i,j,k) for(int i = (j); i > (k); i--)
 16 
 17 const int N = 210;
 18 double p_x[N];
 19 double p_y[N];
 20 double dis[N][N];
 21 bool vis[N];
 22 double way[N];
 23 int n,x,y;
 24 
 25 void init(){
 26     rep(i,1,n) rep(j,1,n){
 27         if(i == j) dis[i][j] = 0;
 28         else dis[i][j] = inf;
 29     }
 30     rep(i,1,n) vis[i] = false;
 31 }
 32 
 33 void input(){
 34 
 35     rep(i,1,n){
 36         cin >> p_x[i] >> p_y[i];
 37     }
 38 }
 39 
 40 inline double fun_dis(double x1, double y1, double x2, double y2){
 41     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
 42 }
 43 
 44 void calculate_dis(){
 45 
 46     rep(i,1,n){
 47         rep(j,1,n){
 48             double tmp_dis = fun_dis(p_x[i],p_y[i],p_x[j],p_y[j]);
 49             if( tmp_dis < dis[i][j] )
 50                 dis[i][j] = dis[j][i] = tmp_dis;
 51         }
 52     }
 53 }
 54 
 55 void dijkstra(){
 56 
 57     rep(i,1,n) way[i] = dis[1][i];
 58     vis[1] = true;
 59 
 60     rep(i,2,n){
 61 
 62         int x = -1;
 63         double v = inf;
 64 
 65         rep(j,1,n){
 66             if(!vis[j] && v > way[j]) v = way[x = j];
 67         }
 68 
 69         if(x == -1) continue;
 70         vis[x] = true;
 71 
 72         rep(k,1,n){
 73             if(!vis[k] && way[k] > max(way[x], dis[x][k])){
 74                 way[k] = max(way[x], dis[x][k]);
 75             }
 76         }
 77     }
 78 }
 79 
 80 int main(){
 81 
 82 
 83     ios::sync_with_stdio(false);
 84     cin.tie(0);
 85 
 86     int cnt = 0;
 87     while(cin >> n){
 88         if(n == 0) break;
 89 
 90         init();
 91         input();
 92         calculate_dis();
 93         dijkstra();
 94 
 95         cout << "Scenario #" << ++cnt << endl;
 96         cout << "Frog Distance = " << fixed << setprecision(3) << way[2] << endl;
 97         cout << endl;
 98     }   
 99 
100     getchar();getchar();
101 
102     return 0;
103 }
相關文章
相關標籤/搜索