数据结构——最小生成树

一、相关概念

  1. 连通图:图中的任意两个节点之间都是联通的,即:总能从A节点按照一定路径走到B节点。
  2. 生成树:为联通图的一个联通子图,包含N个结点和N-1条边。
  3. 最小生成树:当联通图中的每条边带有权值时,所有边权值和最小的生成树。

二、问题导向

    各个城市之间修建铁路,城市之间铺设电缆、水管等,不考虑环境等复杂因素,肯定最小生成树对应的权值(对应管线、铁路等长度)和最小怎样才能成本最低。因此如何铺设的问题转化成了找到这个最小生成树的问题。如下图(A~F表示城市,线上的数字表示距离):

三、相关算法

注:正常情况下没有办法一眼看出来该如何选择的,如果更复杂一点的话就更难用眼睛看出来的了,因此面对该问题需要有响应的算法来解决。听着很高端、实际实现的代码逻辑很复杂,但是懂了思想理解起来很容易。
最终目的: 找到我们想要的N-1条线。

Prim算法:

通俗理解:

  1. 任意选择一个结点开始(从此已有结点多了一个0到1)
  2. 从已有的结点中,找与已有结点和剩下的结点连线权限最小的那个
  3. 迭代重复第二步,直到所有结点都被连接。此时刚哈N-1条边。

举例: 假设以A为第一个点,我们依次被连接的顶点顺序为:A->F->E->D->C->B,边被选择的顺序为:4、2、3、4、3。步骤为红色12345的顺序。

Kruskal算法:

通俗理解:

  1. 从所有的边中找最短的边
  2. 保证,所有的边连起来不能构成环路,如果构成环路则选择次小的边、或者次次小的边,
  3. 按照第二部的要求,重复第一步的过程,直到所有的结点被连接。

举例: 依次被选择的边:2(EF)->3(D)->3(BC)->4(A)->4。步骤为红色12345的顺序。

  
  
Email : Beyonderwei@Gmail.com
Website : http://beyonderwei.com
  
WeChat:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值