prim算法

Prim算法用于寻找无向图的最小生成树。它从一个顶点开始,逐步添加边,确保不形成回路,并始终保持连通,直至添加n-1条边连接所有n个顶点。在过程中,每次选择当前未加入生成树中权值最小的边。通过维护一个closedges[]数组记录每个顶点与其相邻顶点的最短距离,逐步构建最小生成树。算法适用于寻找如公司办公室间最低开销的通讯网络布局。
摘要由CSDN通过智能技术生成

这几个概念清楚就别看了

 

完全图:任意两个顶点间都有直达的边相连的无向图。

连通图:任意两个顶点间都有路径相通的无向图。

      

生成树:一个连通图的生成树是指一个极小连通子图,含有图中的全部n个顶点,但只有足以构成一棵树的n-1条边

为什么是n个顶点和n-1条边呢?

我们知道树的结构,一个节点可以通过一根树支访问它的父节点,所以一个节点对应一根树枝,但树的根是没有父节点的,所以是n个节点对应n-1根树枝。若这些树枝不仅可以由子节点访问父节点,也可以由父节点访问子节点,这样的话整棵树任意两个节点都可以有路径相通,所以生成树就是一个通过顶点来确定边数使之最少的连通图。

可以发现,连通图的生成树可能并不唯一:

      

例:某公司想在各个办公室之间铺设通讯网络,每两个办公室之间距离不同,若想达到最低开销该怎么办?

完全图花费太大显然不行,那就先铺设代价最小的边,再铺设次之的边,直到铺完了n-1条边,过程中要保持连通且不能构成回路(有回路必定不连通),最终会确定一个花费最小的极小连通图,也就是这个连通图的最小生成树

那么如何用算法找到这个最小生成树呢?

在上面的分析中可以发现,解决最小生成树的问题有两个:

(1):尽可能选取权值最小的边且不构成回路;

(2):选n-1条边连n个节点。

此时就说到prim算法了。这个思想还是直接用图画出来(写也写不清0.0):

完全图是这样:

先在其中选一个顶点作为生成树的根:

   

此时可以将完全图看成两个图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值