克鲁斯卡尔算法
算法思想
每次找出侯选边权值最小的边将该边并入生成树中,循环重复直到所有的边都被检测完为止。
卡鲁斯卡尔最小生成树
边按权值从小到大排序,从最小的边开始,判断边并入是否会构成回路,不构成回路则并入当前生成树中
过程模拟
以顶点0为起点
(1)顶点0的侯选边权值5、1、2,引入权值最小的边1并入生成树
(2)侯选边权值分别为5、2、3、6、2,选择侯选边权值为2的其中一个侯选边都行。
(3)侯选边权值分别是5、2、6、3、4、3,选择2。
(4)剩下权值为5、3、4、3、6的侯选边,选择3
注意:选择侯选边并入生成树不能形成环
#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;//生成树的权值累加 } }}
CSDN:yma16
微信公众号:ymacode
数据结构框架学习