zoukankan      html  css  js  c++  java
  • 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:
    ", ++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 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    解题报告:luogu P1156
    解题报告:AT3605
    矩阵乘法与斐波那契数列
    九、模块
    八、异常
    七、文件处理
    六、对象和内存分析
    五、函数和内存分析
    四、控制语句
    三、序列
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4224437.html
Copyright © 2011-2022 走看看