算法10 之带权图

Posted 风口的碟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法10 之带权图相关的知识,希望对你有一定的参考价值。

上一节我们已经看到了图的边可以有方向,这一节里,我们将探讨边的另一个特性:权值。例如,如果带权图的顶点代表城市,边的权可能代表城市之间的距离,或者城市之间的路费,或者之间的车流量等等。

    带权图归根究底还是图,上一节那些图的基本操作,例如广度优先搜索和深度优先搜索等都是一样的,在这一节里,我们主要来探讨一下带权图的最小生成树最短路径问题。

最小生成树问题

    首先探讨下最小生成树问题,它与上一节所提到的最小生成树不同。上一节的最小生成树是个特例,即所有边的权值都一样。那么算法如何设计呢?建议用优先级队列来实现这个反复选择最小的路径,而不是链表或数组,这是解决最小生成树的有效方式。在正式的程序中,优先级队列可能基于堆来实现(关于堆,可参见第8节内容),这会加快在较大的优先级队列中的操作。但是在本例中,我们使用数组实现优先级队列,仅仅为了说明算法。算法要点如下:

    从一个顶点开始,把它放入树的集合中,然后重复做下面的事情:

    1. 找到从最新的顶点到其他顶点的所有边,这些顶点不能在树的集合中,把这些边放入优先级队列中。

    2. 找出权值最小的边,把它和它所达到的顶点放入树的集合中。

    重复这些步骤,直到所有的顶点都在树的集合中,这时工作完成。

    下面先看一下最小生成树的代码,然后再解释一些细节上的问题: