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 }