这一题算是最短路的变型,要求的是从起点到终点的所有路中最小的一段最大,即求一条最长路,输出这条路中的最小值。我是用Dijstra算法做的。
AC code:
1 #include <iostream>
2 #define MAX 2000
3 using namespace std;
4 int map[MAX][MAX];
5 bool vis[MAX];
6 int dis[MAX];//存放从起点到第i点的最长路中的最短边长度
7 int num;//记录方案数
8 int n, m;
9
10 void Dij()
11 {
12 int max;
13 int v = 0;
14 vis[0] = true;
15 dis[1] = 0;
16 for(int i1 = 1; i1 <=n; i1++)//初始化
17 dis[i1] = map[1][i1];
18 for(int i2 = 1; i2 <= n; i2++)
19 {
20 max = 0;
21 for(int i3 = 1; i3 <= n; i3++)
22 {
23 if(!vis[i3] && dis[i3] > max)
24 {
25 max = dis[i3];
26 v = i3;
27 }
28 }
29 vis[v] = true;
30 for(int i4 = 1; i4 <= n; i4++)
31 {
32 if(!vis[i4])
33 {
34 if(map[v][i4] > max)
35 {
36 dis[i4] = max;
37 }
38 else if(map[v][i4] > dis[i4])
39 {
40 dis[i4] = map[v][i4];
41 }
42 }
43 }
44 }
45 cout<<"City #"<<num<<":"<<endl
46 <<dis[n]<<endl<<endl;
47 }
48 int main()
49 {
50 int t;
51 scanf("%d", &t);
52 num = 0;
53 for(int i = 0; i < t; i++)
54 {
55 scanf("%d%d", &n, &m);
56 memset(map, 0, sizeof(map));
57 memset(vis, 0, sizeof(vis));
58 memset(dis, 0, sizeof(dis));
59 for(int j = 0; j < m; j++)
60 {
61 int start;
62 int end;
63 int weight;
64 scanf("%d%d%d", &start, &end, &weight);
65 map[start][end] = weight;
66 map[end][start] = weight;
67 }
68 num++;
69 Dij();
70 }
71 return 0;
72 }