解题报告:{HDU}{1874}{畅通工程续}

来源:互联网 发布:辛辛那提大学好吗 知乎 编辑:程序博客网 时间:2024/06/05 10:36

题目:

  • Problem Description
  • 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
  • Input
  • 本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数N和M(0接下来是M行道路信息。每一行有三个整数A,B,X(0再接下一行有两个整数S,T(0<=S,T
  • Output
  • 对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
  • Sample Input
  • 3 30 1 10 2 31 2 10 23 10 1 11 2
  • Sample Output
  • 2-1

 

分析:
很显然,这题是一道很纯的最短路问题,可以直接使用Dijkstra解决。获取有关最短路问题的知识可以先看算法导论第
24章,或者先读一下余远铭的《最短路算法及其应用》
就这道题而言,我具体的实现是这样的:
1.由于输入规模不大,我选择邻接矩阵Cost[x][y]来保存这张图。另外为了完成Dijkstra算法,至少需要表示当前点
最短路的dest[N]和表示当前点是否已被拓展的used[N]两个数组,在初始化时,应当将Cost和dest的每一项初始化为INF
(一个很大的数),used[N]应当初始化为0。
2.输入完成后,需要定义好过程的初始状态:首先,将used[S]标记为1(已拓展);其次,由于每一次迭代时都用
Path_Now作为当前具有最短路性质的点,所以Path_Now=S;再然后,我用dest数组的第201位即dest[200]作为标定的值
(在整个过程中值不被改变),则只需要用一个下标Min_Num并赋初值为200即可找到一次所有已访问点中具有最短路性质的点。
3.接下来便是算法实现的部分,根据Dijkstra算法的思想,比较直观的办法是,不断的循环扫描图中的每一个节点,将
那些可以直接到达当前具有最短路性质的点i找出来,并将其值赋dest[i]为dest[i]与dest[i]+Cost[i][j]中较小的一个。
针对一个具有最短路性质的点扫描完以后,将这个点标记为已扩展,并在所有未扩展的点中找出值最小的一个进行下一次扩展,如
果所有为扩展的点都不可达或者找到的最小未扩展点是要到达的点T
,则跳出该循环。
4.这样算法已经结束了,只需要再输出dest[T]就可以了,当然根据题意,如果dest[T]==INF(值未改变),则表示
不能达到,输出-1。
.
代码:
注意:
1.初始化操作
2.题目没有讲的太清楚,但是输入要考虑重边选择最小的情况,我就因为这个问题卡了半天
3.迭代过程中找最小未扩展节点的位置时不要太省..

 

原创粉丝点击