题目链接:
http://poj.org/problem?id=1797
题目描述:
有n个交叉口,m条路,每条路有三个属性:起点,终点,最大载重。假设从a到b的最大载重是从a—>b所能承载的最大重量,问从1—>n的最大载重是多少?
解题思路:
利用dijkstra的变形,dist数组里存的不再是最短路径了,而是最大载重,也许描述的不是很清楚,但是代码很清楚。
ps:类似的题目在今年省赛时候见过,当时刚接触图,所以就想用排序+并查集做,这道题目的做法很多,不止这两种。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 #define maxn 1010 8 9 int n, m; 10 int map[maxn][maxn], vis[maxn], dist[maxn]; 11 void dijkstra (); 12 13 int main () 14 { 15 int i, j, l = 0, a, b, s, ncase; 16 scanf ("%d", &ncase); 17 18 while (ncase --) 19 { 20 scanf ("%d %d", &n, &m); 21 memset (map, 0, sizeof(map));//注意数组的初始化 22 23 for (i=0; i<m; i++) 24 { 25 scanf ("%d %d %d", &a, &b, &s); 26 map[a][b] = map[b][a] = s; 27 } 28 29 dijkstra (); 30 printf ("Scenario #%d: ", ++l); 31 printf ("%d ", dist[n]); 32 } 33 return 0; 34 } 35 36 void dijkstra () 37 { 38 int i, j, temp, index; 39 40 memset (vis, 0, sizeof(vis)); 41 for (i=1; i<=n; i++)//初始化dist 42 dist[i] = map[1][i]; 43 vis[1] = 1;//把起点加入集合 44 45 for (i=1; i<n; i++) 46 { 47 temp = 0; 48 for (j=1; j<=n; j++)//选要加入集合点 49 if (!vis[j] && temp < dist[j]) 50 { 51 temp = dist[j]; 52 index = j; 53 } 54 55 vis[index] = 1;//加入选中的最优点 56 57 for (j=1; j<=n; j++)//判断加入点后会不会对其他未加入的点有影响 58 { 59 if (!vis[j] && map[index][j]) 60 { 61 temp = min(dist[index], map[index][j]);//把j加入集合的最大载重值,也可以说是瓶颈值 62 if (temp > dist[j])//若能扩大j的最大载重值,则扩大 63 dist[j] = temp; 64 } 65 } 66 } 67 }