最小生成树与最短路径


44

最小生成树算法和最短路径算法有什么区别?

在我的数据结构课程中,我们介绍了两种最小生成树算法(Prim和Kruskal)和一种最短路径算法(Dijkstra)。

最小生成树是图形中跨越所有顶点的树,并且树的总权重最小。最短路径很明显,它是从一个顶点到另一个顶点的最短路径。

我不明白的是,由于最小生成树的总权重最小,树中的路径不是最短的路径吗?有人可以解释我所缺少的吗?

任何帮助表示赞赏。


这是我针对类似问题的示例,该问题证明最小生成树与最短路径不同。cs.stackexchange.com/a/43327/34363
atayenel 2015年

另外,这可能很有趣。最大生成树在节点之间具有路径,其中每个路径都是瓶颈路径,即,不是最小化总和,而是最大化最小权重。最小生成树之间可能存在类似的关系。
尤金(Eugene)

Answers:


37

考虑具有单位权重的三角形图-它具有三个顶点,并且所有三个边权重为。两个顶点之间的最短路径是直接路径,但是如果将所有两个顶点放在一起,则会得到一个三角形而不是一棵树。两个边的每个集合都在该图中形成最小的生成树,但是(例如)如果选择,那么您会错过最短路径。x,y,z{x,y},{x,z},{y,z}1{x,y},{y,z}{x,z}

总之,如果将所有最短路径放在一起,则不一定会得到一棵树。


32

没错,Dijkstra(从单个起始节点开始的最短路径)和Prim(从给定节点开始的最小权重生成树)的两种算法具有非常相似的结构。它们既贪婪(从当前角度出发,占据最佳优势),又在图上建立一棵树。

但是,它们最小化的值是不同的。Dijkstra选择从树中引出到尚未选择到最接近起始节点的节点的下一条边缘。(然后使用此选择,将重新计算距离。)Prim选择了到目前为止构建的树中最短的一个作为边缘。因此,两种算法都选择了“最小边缘”。主要区别在于选择的值最小。对于Dijkstra来说,它是从起始节点到候选节点的完整路径的长度,对于Prim而言,它只是那条单边的权重。

要了解差异,您应该尝试构建一些示例以了解会发生什么,这确实很有启发性。显示不同行为的最简单示例是三角形,其边缘和 的长度为2,而 长度为1。 Dijkstra将选择 和 (给出两个长度为2的路径),而Prim选择 和(给出重量3)。x,y,z{x,y}{x,z}{y,z}x{x,y}{x,z}{x,y}{y,z}

树:Dijkstra vs Kruskal

至于Kruskal,则略有不同。它解决了最小生成树的问题,但是在执行过程中,它选择的边缘可能不会形成一棵树,它们只是避免了循环。因此,部分解决方案可能会断开连接。最后,您会得到一棵树。


12

尽管最小生成树算法和最短路径算法的计算看起来相似,但它们专注于2个不同的要求。

在MST中,要求到达每个顶点一次(创建图树),并且达到所有顶点的总(集体)成本在所有可能的组合中必须最小。

在最短路径中,要求以最低的成本(最短的权重)从源顶点到达目标顶点。因此,这里我们不必担心到达每个顶点,而只关注源顶点和目标顶点,这就是区别所在。

这是说明为什么MST不一定在2个顶点之间给出最短路径的示例。

(A)----5---(B)----5---(C)
 |                     |
 |----------7----------| 

在MST情况下,边缘AB。BC将使用MST,总重量为10。因此,在MST中达到A到C的成本为10。

但是在最短路径的情况下,A到C之间的最短路径是AC,即7。AC从未处于MST上。


4

不同之处在于此算法的最终目标是什么-

Dijkstra's-这里的目标是从头到尾。您只关心这2点,并相应地优化路径。

Krusal's-在这里,您可以从任何点开始,并且必须访问图中的所有其他点。因此,您可能并不总是选择任何两个点的最短路径。相反,重点是选择一条路径,使您在所有其他点上都走得更短。


1

我认为一个例子将使其更清楚。

在此处输入图片说明

生成树如下所示。这是因为,如果我们在此配置中合计边缘,则可能得到的总成本最低:2 + 5 + 14 + 4 = 25。

(1)   (4)
  \   /
   (2)
  /   \
(3)   (5)

通过盯着生成树,您可能会错误地认为它为您提供了最短的路径,但实际上却没有。举个例子,如果我们要从节点(1)转到(4)它,将花费我们7。但是,如果我们在原始图中使用Dijkstra的算法,我们会发现我们可以直接从节点(1)转到(4),成本为5


-1

展示差异的实用示例>

假设您乘火车到达城镇,并想到达酒店。

选项1:乘坐出租车:从车站到酒店,出租车将以最短的路线行驶。驾驶员是否应沿着以车站为中心的最短路径树走。

选项2:乘公共汽车。公交公司想迎合可能的人,而不仅仅是您。理想的道路将覆盖该镇的所有关键点。因此它将沿着最小生成树遵循(*)路径。这就是公交车速度较慢的原因,但由于费用分摊,所以价格便宜。

(*)实际上,如果使用最小的生成树,人们会抱怨(公交车路程太长)。因此,在实践中这将是一个混合解决方案,并且将使用Alpha-Tree(最小生成树和最短路径树之间的半路)。


1
欢迎来到该网站。我认为您的比喻不是一个很好的例子,因为公交车的路线似乎与生成树没有太大关系。特别是,它没有跨越(它没有访问镇上的每个点),也不是一棵树。相反,它是某种路径(或循环),在合理的范围内接近或经过尽可能多的重要点,因此该路径对于相当多的人而言是相当有用的。
David Richerby

-1

它们基于两个不同的属性。最小生成树基于剪切属性,而最短路径基于边缘松弛属性。

剪切将图形分为两个部分。它可能涉及多个边缘。在MST中,我们选择权重最小的边缘。

边缘松弛表示,如果dist(a,b)+ edge(b,c)小于dist(a,c),然后我可以放松edge(ac)。放松所有边缘后,我们得到了最短的路径。

我强烈建议您观看Robert Sedgewick教授关于图形算法的视频。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.