zoukankan      html  css  js  c++  java
  • HDU 1595 find the longest of the shortest

    http://acm.hdu.edu.cn/showproblem.php?pid=1595

    题意:

    有n条路,其中某一条路不通,求最短路的最大值。

    思路:

    这条路是任意的,所以肯定是需要枚举的。先走一遍dijkstra,记录好路径,之后如果不通的路不在最短路径上,那么最短路的值是不会变的。枚举最短路上的路径,每次枚举时再走一遍dijkstra,找一个最大值。

     1 #include <iostream>  
     2 #include <cstring>  
     3 #include <algorithm>   
     4 #include <vector>
     5 #include <queue>
     6 using namespace std;
     7 
     8 const int maxn = 1000 + 5;
     9 const int inf = 0x3f3f3f3f;
    10 
    11 int map[maxn][maxn];
    12 int vis[maxn], d[maxn], pre[maxn];
    13 int n, m;
    14 
    15 void Dijkstra(int flag)
    16 {
    17     memset(vis, 0, sizeof(vis));
    18     for (int i = 0; i <= n; i++)
    19         d[i] = inf;
    20     d[1] = 0;
    21     for (int i = 1; i <= n; i++)
    22     {
    23         int min = inf;
    24         int u;
    25         for (int j = 1; j <= n; j++)
    26         {
    27             if (d[j] < min && !vis[j])
    28             {
    29                 min = d[j];
    30                 u = j;
    31             }
    32         }
    33         if (min==inf)  break;
    34         vis[u] = 1;
    35         for (int j = 1; j <= n; j++)
    36         if (d[u] + map[u][j] < d[j])
    37         {
    38             d[j] = d[u] + map[u][j];
    39             if (flag)   pre[j] = u;
    40         }
    41     }
    42 }
    43 
    44 int main()
    45 {
    46     //freopen("D:\input.txt", "r", stdin);
    47     while (~scanf("%d%d", &n, &m))
    48     {
    49         for (int i = 0; i <= n; i++)
    50         {
    51             for (int j = 0; j <= n; j++)
    52                 map[i][j] = inf;
    53             map[i][i] = 0;
    54         }
    55         while (m--)
    56         {
    57             int u, v, w;
    58             scanf("%d%d%d", &u, &v, &w);
    59                 map[u][v] = map[v][u] = w;
    60         }
    61         memset(pre, -1, sizeof(pre));
    62         Dijkstra(1);
    63         int ans = d[n];
    64         for (int i = n; i != 1; i = pre[i])
    65         {
    66             int dist = map[i][pre[i]];
    67             map[i][pre[i]] = map[pre[i]][i] = inf;
    68             Dijkstra(0);
    69             ans = max(ans, d[n]);
    70             map[i][pre[i]] = map[pre[i]][i] = dist;
    71         }
    72         printf("%d
    ", ans);
    73     }
    74 
    75     return 0;
    76 }
  • 相关阅读:
    JavaScript之作用域和闭包
    mui.openWindow的html5+和web传参的兼容
    HTML5地理定位-Geolocation API
    wepy 编译警告去除办法
    Angular网络请求的封装
    网页资源加载的优化方法
    小DEMO之manifest初体验
    HDU 2846 Repository (字典树 后缀建树)
    mongodb适用和不适用的应用场景
    Codeforces 240E. Road Repairs 最小树形图+输出路径
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6666777.html
Copyright © 2011-2022 走看看