• POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)


      做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑......

      本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离,基本思路与最短路一样,dist数组为当前点到源结点最短路的最大距离,这样的话我们知道只需要改变松弛方程就可以了,每次我们选取一个最小值dist[ k ],那么接下来我们就需要将与结点k相邻的结点都更新,如何更新呢,当然是选取之前所走路中的最大值和现在需要走的路中的值的最大值啦即dist[ j ] = max(dist[ k ], G[ k ][ j ]); 。

      好了参考代码(不建议看代码,自己上面的思路理解,就改变松弛函数即可)。

     

     1 //最短路变形:最长路中的最短路
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <cstdio>
     6 using namespace std;
     7 
     8 const int maxn = 200 + 5;
     9 const double INF = 0x3f3f3f3f;
    10 struct Point {
    11     int x, y;
    12 } point[maxn];
    13 int n, k, Case = 0;
    14 double G[maxn][maxn], dist[maxn];
    15 bool vis[maxn];
    16 
    17 double dis(int i, int j) {
    18     return sqrt((double)(point[i].x - point[j].x) * (point[i].x - point[j].x) + (point[i].y - point[j].y) * (point[i].y - point[j].y));
    19 }
    20 
    21 double Dijkstra() {
    22     memset(vis, false, sizeof vis);
    23     for(int i = 1; i <= n; i ++)
    24         dist[i] = (i == 1 ? 0 : INF);
    25     for(int i = 1; i <= n; i ++) {
    26         double minf = INF;
    27         for(int j = 1; j <= n; j ++)
    28             if(!vis[j] && dist[j] < minf) {
    29                 minf = dist[j];
    30                 k = j;
    31             }
    32         vis[k] = true;
    33         for(int j = 1; j <= n; j ++) {
    34             if(!vis[j] && dist[j] > max(dist[k], G[k][j])) {
    35                dist[j] = max(dist[k], G[k][j]);
    36             }
    37         } 
    38     }
    39     return dist[2];
    40 }
    41 
    42 int main () {
    43     while(cin >> n && n) {
    44         for(int i = 1; i <= n; i ++)
    45             cin >> point[i].x >> point[i].y;
    46         for(int i = 1; i <= n; i ++) {
    47             for(int j = 1; j <= n; j ++)
    48                 G[i][j] = G[j][i] = dis(i, j);
    49         }
    50         printf("Scenario #%d
    Frog Distance = %.3f
    
    ", ++ Case, Dijkstra());
    51     }
    52     return 0;   
    53 }
    View Code
  • 相关阅读:
    eclipse恢复界面默认设置
    文件夹的拷贝
    文件的输入输出
    十进制转二进制,八进制,十六进制(查表法)
    数组元素的查找(折半查找)
    C++几个小函数
    C++ 内部排序(一)
    C++实现链表
    C++输出IP地址段内的合法地址
    我看软件工程师的职业规划
  • 原文地址:https://www.cnblogs.com/bianjunting/p/10687652.html
Copyright © 2020-2023  润新知