关于最小生成树,最短路径的一些比较和思考,引用代码为c/c++描述

  本文生成最小生成树的代码,引用自Prim算法,图的最小生成树,c/c++描述
https://blog.csdn.net/zhangzhangkeji/article/details/119280054
  本文生成图里所有顶点间的最短路径的Floyd算法代码,引用自Floyd算法
https://blog.csdn.net/zhangzhangkeji/article/details/119487730
  得到的结果如图:
在这里插入图片描述

  问题1:最小生成树是针对有向图还是无向图?
  答:本文举例是以无向图为例。课本也是以“无向图的连通分量和生成树”为标题的。生成树是图的最小连通子图,只要求树里包括图的所有顶点,任意两顶点间都有路径连通,且所有边的权值和最小。所以MST对于无向图,最为合适。有向图的路径A——>B与B——>A会有很大区别,权值不同,要求有向图的所有顶点间有路径连通,就要指明路径的起点终点,否则没有意义。对于有向图的MST,就会很复杂。所以最小生成树,专指对无向图的研究。其也有实际的应用。比如工程施工。
  
  问题2:对于无向图的最小生成树的求解,是否可以理解为求出了顶点间的最短路径?
  答:生成树里的边的权值和是最小的。包含边也是不引起构成环的情况下的n - 1 条最短边,n 是顶点数。 那么我们有疑问,由这些尽可能短的边,是否构成了顶点间的最短路径呢?那样的话,对无向图的求解,岂不一举两得了,既求得了最小生成树,也求得了最短路径?答案是不确定的。因为两个问题的考虑侧重点不一样。
  最小生成树选边的标准是连通到所有的顶点,且所有边的权值和最小。最短路径只要求两个顶点间的路径上的边的权值和最小,不考虑其他顶点的影响,也不要求路径上有图里所有顶点。举个极端的例子,图里只有顶点ABCD,最小生成树恰好是A——B——C——D,那么由MST得到A——D的路径只有一条A——B——C——D,这是A到D的最短路径么?未必,因为A到D未必要包括其他所有顶点。从上面给的图里,我们也可以举出多个反例。例如图里A——B的最短路径,由Floyd算法给出结果是34.可是最小生成树里就没有AB这条34的边。
  所以MST和最短路径是两个不同的问题,其结果也不能互相替代。minimal spanning tree
  
  问题3 : 最短路径里任意两个顶点间的路径都是最短路径么?
  答:答案是是的。我认为。从上图Floyd结果里也可以佐证。下面试着给出其证明。用反证法,毕竟经过证明的东西才是正确的。归纳法,也不是仅凭一个特例得出结论。
  假如对于图(V,E),V = {A,B,C,D,E},已求出其所有顶点间的最短路径。已知A——>B——>C——>E是A到E的最短路径,A——>B——>C是A到C的最短路径,我们要断定C——>E也是最短路径。假如C——>E不是最短路径,并且C——>D——>E路径更短,那么A到E的最短路径就要修改为A——>B——>C——>D——>E,这与我们的假设前提是不相符的。
  假如C——>B——>E是C到E比CE更短的路径,那么A到E的最短路径就要修改为:A——>B——>C——>B——>E,进一步修改为A——>B——>E,这与我们用Floyd算法求得的真正最短路径,那个已知前提仍然是不相符的,所以我们的假设是错误的。结论是C——>E只能是C到E的最短路径。
  因为某两点间的最短路径上不一定包括其他所有顶点,我们从一条最短路径,并不能得到其他任意两顶点间的最短路径。所以要求所有顶点间的最短路径,还是要老老实实用Floyd算法。

谢谢阅读。不对的地方欢迎一起探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值