我知道Prim和Dijkstra算法之间的区别。前者产生MST,而后者产生从源到所有节点的最短路径。从数学上讲,这些都不相同,所以我们总是希望这两种算法能够产生相同的结果。
然而,在尝试不同的例子时,我得到了相同的结果。 Prim算法和Dijkstra算法的伪代码看起来非常相似。有人可以给我一个例子,Prim的产生MST,在用Dijkstra解决时不会获得,反之亦然。
另外,据我所知。这两种算法都使用以下方法。如果我错了,请纠正我:
找到最短的i-j,其中i来自已经包含的集合和j 来自尚未包含的集合,然后将j添加到集合中。
答案 0 :(得分:5)
一个简单的例子是放置在正方形角落的四个节点的集合。将成本2的边缘放置在任意两个相邻的角之间,并将成本3的边缘对角地放在正方形上。从任何角落运行Dijkstra算法都会选择这些边缘:
* -- *
| \
| \
* *
这些是最短的路径,边缘的总成本是7。
运行Prim的算法将选择这些边缘:
* -- *
|
|
* -- *
这是一个MST(总边缘成本为6),但这些不是最短路径(从左上角到右下角的路径成本为4,但可能有更直接的路径。)
作为挑战:尝试寻找图表
Prim和Dijkstra都通过找到一个不在一个集合中的节点并将其带入集合中来选择一个节点,但它们在调整距离方面有所不同。在Prim算法中,使用的距离始终是从集合外的任何节点到集合内任何节点的最小距离。在Dijkstra的算法中,距离是以下值的最小值:
距离(起始节点,u)+ l(u,v)
换句话说,Dijkstra的算法会影响从开始节点到集合外部节点的距离,而Prim则不会。
希望这有帮助!
答案 1 :(得分:1)
考虑a-b有100个长度,a-c有100个长度,b-c有1个长度。以a为根的最短路径树是a-b和a-c。 mst是b-c和其他边缘之一。链接:Create a MST with depth-first search?。