图的最小生成树与最短路径

两者没有太大的关联,只不过在一定程度上应用了贪心算法的思想而已,但区别比较明显。

一、区别

最小生成树能够保证首先是树(对于n个顶点的图只有n-1条边),其次保证任意两个顶点之间都可达,再次保证这棵树的边权值之和为最小,但不能保证任意两点之间是最短路径。

最短路径保证从源点S到目地点D的路径最小(有向图中不要求终点能到起点),不保证任意两个顶点都可达

二、最小生成树

  1. 普里姆(Prim)算法
    Prim算法是以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的
    算法描述:
    从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。
    (1)输入:一个加权连通图,其中顶点集合为V,边集合为E;
    (2)初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {};
    (3)重复下列操作,直到Vnew = V:
    在集合E中选取权值最小的边(u, v),其中u为集合Vnew中的元素,而v则不是(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
    将v加入集合Vnew中,将(u, v)加入集合Enew中;
    (4)输出:使用集合Vnew和Enew来描述所得到的最小生成树。

  2. 克鲁斯卡尔(Kruskal)算法
    将连通网中的所有边按照权值大小进行升序排序,从小到大依次选择。

由于最小生成树本身是一棵生成树,所以需要时刻满足以下两点:
(1)生成树中任意顶点之间有且仅有一条通路,也就是说,生成树中不能存在回路;
(2)对于具有 n 个顶点的连通网,其生成树中只能有 n-1 条边,这 n-1 条边连通着 n 个顶点。
参考链接

二、最短路径

迪杰斯特拉(Dijkstra)算法
1.算法思想
令G = (V,E)为一个带权有向图,把图中的顶点集合V分成两组,第一组为已求出最短路径的顶点集合S(初始时S中只有源节点,以后每求得一条最短路径,就将它对应的顶点加入到集合S中,直到全部顶点都加入到S中);第二组是未确定最短路径的顶点集合U。在加入过程中,总保持从源节点v到S中各顶点的最短路径长度不大于从源节点v到U中任何顶点的最短路径长度。
2.算法步骤
(1)初始化时,S只含有源节点;
(2)从U中选取一个距离v最小的顶点k加入S中(该选定的距离就是v到k的最短路径长度);
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源节点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值是顶点k的距离加上k到u的距离
(4)重复步骤(2)和(3),直到所有顶点都包含在S中。

注:迪杰斯特拉(Dijkstra)算法和普里姆(Prim)算法找下一点的区别是迪杰斯特拉就算加入下一点也一直是找离源点最近的,而普里姆加入下一点之后是找离已加入的这块区域中某个点最近的,可参考示例

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值