最小生成树唯一吗_最小生成树——克鲁斯卡尔算法

785d2dca97220ade01daeeb11d0079fa.gif

克鲁斯卡尔算法

91962d307726f59d0fd14e8399ab78b2.gif

算法思想

每次找出侯选边权值最小的边将该边并入生成树中,循环重复直到所有的边都被检测完为止。

卡鲁斯卡尔最小生成树

边按权值从小到大排序,从最小的边开始,判断边并入是否会构成回路,不构成回路则并入当前生成树中

过程模拟

以顶点0为起点

6944f2874e4f8e5633a5119a3a00e093.png

(1)顶点0的侯选边权值5、1、2,引入权值最小的边1并入生成树

f426b4a5775cb70abb75226da790bf8c.png

(2)侯选边权值分别为5、2、3、6、2,选择侯选边权值为2的其中一个侯选边都行。

2fda22494dd62fa9549d3954b441d132.png

(3)侯选边权值分别是5、2、6、3、4、3,选择2。

a470423a2dc6d927b4c456893297350b.png

(4)剩下权值为5、3、4、3、6的侯选边,选择3

99b5bcdc99d93e8d729b082d79e3c238.png

注意:选择侯选边并入生成树不能形成环

#define maxsize 100#define INF 100typedef struct{  int no;//结点  char info;//信息 }VertexType;typedef struct{  int edges[maxsize][maxsize];//邻接矩阵  int n,e;//顶点数和边数  VertexType vex[maxsize];//图的邻接矩阵}MGraph;typedef struct{  int a,b;//一条边连接的两个顶点   int w;//边的权值 }Road;Road road[maxsize];//int v[maxsize];//定义并查收集数组int getRoot(int a){  while(a!=v[a])  {    a=v[a];  }  return a;//查找根节点 } void Kruskal(MGraph g,int &sum,Road road[]){  int i;  int N,E,a,b;  N=g.n;//顶点数   E=g.e;//边数   sum=0;//记录权值   for(i=0;i    v[i]=i;  }  sort(road,E);//road数组按权值进行排序 ,待写...  for(i=0;i    a=getRoot(road[i].a);//顶点    b=getRoot(road[i].b);//    if(a!=b)    {      v[a]=b;      cout<" ";       sum+=road[i].w;//生成树的权值累加      }   }}
d65b18b543a64729d70c1ade2c464ac2.gif d65b18b543a64729d70c1ade2c464ac2.gif e00778eaf2d3c0d3e5ecbd6f18444221.png

CSDN:yma16

微信公众号:ymacode

数据结构框架学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值