今天兴致勃勃的开始做了贪心算法的第一道题目:Single-Source Shortest-Paths Problem
也就是所谓的单源最短路径,课件上有算法,但是代码实现起来还真是不容易(仅仅对于我这个菜鸟来说),下面是算法框架:
设S为最短距离已确定的顶点集(看作红点集),V-S是最短距离尚未确定的顶点集(看作蓝点集)。
①初始化
初始化时,只有源点s的最短距离是已知的(D(s)=0),故红点集S{s} 。
②重复以下工作,按路径长度递增次序产生各顶点最短路径
在当前蓝点集中选择一个最短距离最小的蓝点来扩充红点集,以保证算法按路径长度递增的次序产生各顶点的最短路径。
当蓝点集中仅剩下最短距离为∞的蓝点,或者所有蓝点已扩充到红点集时,s到所有顶点的最短路径就求出来了。
示例图形如下:
Q | u | S | 临接点 | d[1] | d[2] | d[3] | d[4] |
{0,1,2,3,4} |
| Φ |
| ∞ | ∞ | ∞ | ∞ |
{1,2,3,4} | 0 | {0} | 1,4 | 10 |
| 30 | 100 |
{2,3,4} | 1 | {0,1} | 2 |
| 60 |
|
|
{2,4} | 3 | {0,1,3} | 4,2 |
| 50 |
| 90 |
{4} | 2 | {0,1,3,2} | 4 |
|
|
| 60 |
Φ | 4 | {0,1,2,3,4} |
|
|
|
|
|
有了这样思路下面就要来实现代码了:
下面是我自己写了三个小时的代码,可以输入0~4之间的任意数字,拿来给大家分享(高手别喷):