poj 1797 Heavy Transportation

题目链接:

  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:\n", ++l);
31         printf ("%d\n\n", 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 }

 

你可能感兴趣的:(port)