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\n", ans);
73     }
74 
75     return 0;
76 }

 

posted @ 2017-04-04 22:30  Kayden_Cheung  阅读(120)  评论(0编辑  收藏  举报
//目录