题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1595
5 6 1 2 4 1 3 3 2 3 1 2 4 4 2 5 7 4 5 1 6 7 1 2 1 2 3 4 3 4 4 4 6 4 1 5 5 2 5 2 5 6 5 5 7 1 2 8 1 4 10 2 3 9 2 4 10 2 5 1 3 4 7 3 5 10
11 13 27
题意:假设图中某条路径被堵死,它的最坏情况下的最短路径是多少?基本算法就是先求出最短路径,然后假设最短路径中的某一条边被堵死,再求最短路,取这些最短路的最大值即可。
代码如下:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <cstdlib> #include <climits> #include <ctype.h> #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #include <iostream> #include <algorithm> using namespace std; #define PI acos(-1.0) #define INF 0x3fffffff //typedef long long LL; //typedef __int64 LL; #define MAXN 1017 int mat[MAXN][MAXN]; int n, m; int re[MAXN];//记录路径 void init() { for(int i = 0; i <= n; i++) { re[i] = 0; for(int j = 0 ; j <= n; j++) { if(i == j) mat[i][j] = 0; else mat[i][j] = INF; } } } int dijkstra (int f) { int dis[MAXN];//记录到任意点的最短距离 int mark[MAXN];//记录被选中的结点 int i,j,k = 0; for(i = 0 ; i <= n ; i++)//初始化所有结点,每个结点都没有被选中 mark[i] = 0; for(i = 0 ; i <= n ; i++) { dis[i] = INF; } // mark[1] = 1; dis[1] = 0;//start为1 int min ;//设置最短的距离。 for(i = 1 ; i <= n; i++) { min = INF; for(j = 1 ; j <= n;j++) { if(mark[j] == 0 && dis[j] < min)//未被选中的结点中,距离最短的被选中 { min = dis[j] ; k = j; } } mark[k] = 1;//标记为被选中 for(j = 1 ; j <= n ; j++) { if( mark[j] == 0 && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离 { dis[j] = dis[k] + mat[k][j]; if(f) re[j] = k; } } } return dis[n]; } int main() { int i, j; int a, b, v; while(~scanf("%d%d",&n,&m)) { init(); for(i = 0; i < m; i++) { scanf("%d%d%d",&a,&b,&v); if(v < mat[a][b]) { mat[a][b] = mat[b][a] = v; } } int ans = dijkstra(1); for(i = n; i != 1; i = re[i]) { int t = mat[i][re[i]]; mat[i][re[i]] = INF; mat[re[i]][i] = INF; int tt = dijkstra(0);//从0开始为了re[]不再记录路径 if( ans < tt) ans = tt; mat[i][re[i]] = t; mat[re[i]][i] = t; } printf("%d\n",ans); } return 0; }