最小生成树的Kruskal算法-详解
最小生成树的Kruskal算法
一、 什么是最小生成树
1.1 最小生成树定义:
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
1.2 例子:
通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离
1.3 理解 最小生成树:
将最小生成树拆分成: 最小 生成 树
树:
• 树中没有环
• 所有的顶点都要在树中
• 对于N条顶点,有N-1条边最小:
一个图,可以有很多生成树,我们把一棵树的权值相加,得到权值和。因此不同的生成树就会有不同的权值和,而最小生成树就是权值和最小生成树。
1.4 如何求最小生成树?
• Kruskal算法(克鲁斯卡尔),直接选择权值最小的边
• Prim算法(普里姆算法) 从顶点出发间接选择权值最小的边
二、Kruskal算法(克鲁斯卡尔)求解最小生成树
第一步:
将图中所有的边,都取出放入一个列表中。并按照边的权值由小到大的顺序排序
第二步:
初始化,查源数组(并查集),判断当前图是否存在环
第三步:
回贴过程,按次序每次取出一条边,回帖到图中,每回帖一条新边都要进行判断,当前图的状态中是否存在环。
利用查源数组(并查集)来判断当前图是否存在环回帖A–B
(1)查源:
1.A : 1–1 源头:A
2.B : 2–2 源头:B
3.A,B不同源,即无环
(2)权值和 =4
(3)把 源头 A 对应查源数组的下标的值,改为 源头 B
回帖A–C
- 查源:
(1)A : 1–2 源头:B
(2) C : 3–3 源头:C
(3)A,C不同源,即无环- 权值和 = 4+5
- 把 源头 B 对应查源数组的下标的值,改为 源头 C
回帖B–C
- 查源:
(1) B : 2–3 源头:C
(2)C : 3–3 源头:C
(3)A,C同源,有环。跳过最小生成树为:
最小权值和=9
注:其实直接可以设置,回帖图的边的数目到达N-1时即可退出程序。
三、 最小生成树的Kruskal算法代码
/**
...project: Kruskal算法的设计
...time: 09/05/2020
...author: @DUDU
**/#include<iostream>
using namespace std;
char node[1000];/** (1)图的存储结构 **/
//节点集
typedef struct Node{char a,b; //起点和终点 int w; //权值
}Node;
//边集
typedef struct{int len,n; //长度和顶点的个数 Node *list; //指针
}Graph;/** (2)线性表的初始化 **/
int InitList(Graph &G){G.len=0;G.list=new Node[1000];return 0;
} /** (3)线性表赋初值 **/
int GetList(Graph &G){cout<<"输入节点的个数和边的条数"<<endl;cin>>G.len>>G.n;cout<<"输入节点的名称"<<endl;for(int i=1;i<=G.len;i++)cin>>node[i];cout<<"输入边起点,终点,权值"<<endl;G.list[0].w=0;for(int i=1;i<=G.n;i++)cin>>G.list[i].a>>G.list[i].b>>G.list[i].w;return 0;
} /** 线性表的按权值插入排序 **/
int InsertList(Graph G){int j=0;for(int i=2;i<=G.n;i++){if(G.list[i].w<G.list[i-1].w){G.list[0]=G.list[i];G.list[i]=G.list[i-1];for(j=i-2;G.list[0].w<G.list[j].w;j--)G.list[j+1]=G.list[j];G.list[j+1]=G.list[0];} }return 0;
}/** (4)查找源头 **/
int GetRoot(Graph G,int V[],char x){int y;//将要查询的数转化为并查集数for(int i=1;i<=G.len;i++)if(node[i]==x)y=i;//查源 while(V[y]!=y)y=V[y];cout<<x<<"的源头为:"<<y<<endl; return y;}/** 输(5)出选择路径 **/
int Pop(Graph G,int data[],int t){int m;//输出 cout<<"选择的边和权值为:"<<endl; for(int i=0;i<t;i++){m=data[i];cout<<G.list[m].a<<"-->"<<G.list[m].b<<" :"<<G.list[m].w<<endl; }return 0;
}/** Kruskal算法 **/
int Kruskal(Graph G){//记录最短路径 int sum=0,t=0; int data[1000];//并查集int V[1000]; //并查集初始化 for(int i=1;i<=G.len;i++)V[i]=i;//算法核心 for(int i=1;i<=G.n;i++){int v1,v2;//查找源头v1=GetRoot(G,V,G.list[i].a); //起点源头 v2=GetRoot(G,V,G.list[i].b); //终点源头 if(v1!=v2){sum+=G.list[i].w;V[v1]=v2; //A--C: V[A的源头B] = C的源头Cfor(int k=1;k<=3;k++)cout<<"V["<<k<<"]="<<V[k]<<endl;data[t]=i; //记录回帖的边 t++;}} Pop(G,data,t);return sum;
}int main(){Graph G;InitList(G);GetList(G);InsertList(G);cout<<"最短路径为: "<<Kruskal(G);return 0;
}
最小生成树的Kruskal算法-详解相关推荐
- 最小生成树———prim算法和kruskal算法详解
最小生成树之prim算法(转载出处) 边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用: ...
- Kruskal算法详解
目录 1:kruskal算法介绍 2:kruskal算法代码展现 1:kruskal算法介绍 kruskal算法它是用来解决最小生成树类的问题,至于什么是最小生成树类的问题,就是在图论中,各个点都可以 ...
- 16 - 12 - 06 克鲁斯卡尔(Kruskal)算法详解
算法思路: 直接以边为目标去构建,直接去找最小权值的来构建生成树也是很自然的想法. 只需在构建时小心不要形成环路即可.自然地用到了边集数组. 运行结果↓: <<<想看代码吗 ? 在最 ...
- 最小生成树-Prim算法详解(含全部代码)
目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...
- 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解
基本思想 先构造一个只含 n 个顶点.而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树(不构成回路),则将其加入子图 ...
- 普利姆算法(prim)求最小生成树(MST)过程详解
生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生 ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- C++中的STL算法详解
1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...
最新文章
- 希尔排序算法实现思想个人理解
- 温州大学《深度学习》课程课件(九、目标检测)
- 在现有k8s集群中安装kubesphere时报错:metrics-server failed
- Nginx + Lua + 共享内存实现动态查询(简单例子)
- 计算机专业用锐龙笔记本,轻松应对工作挑战——ThinkPad T14 锐龙版,适合办公的笔记本电脑...
- qq群管+引流+娱乐机器人
- ad自动布线过孔_AD15布线方法汇总
- CSF2020大作业
- 计算机辅助翻译技术工具,计算机辅助翻译技术对译者的影响
- OpenGL ES2.0 的三种变量类型(uniform,attribute和varying)
- 21 Excel动态图表实现原理
- 某计算机内存容量8GB,按字编址,每个字包括2字节,需要多少根地址线?
- python 数据分析教程推荐_太香了!墙裂推荐6个Python数据分析神器!!
- 【新闻】微信出现大面积BUG!腾讯紧急回应!
- 医院信息管理系统论文java_毕业论文-基于java的医院门诊信息管理系统设计与实现...
- 喜马拉雅xm格式转化mp3_如何把喜马拉雅音频改为mp3格式
- soff被判3年,软件业是福是祸?
- L-edit软件界面简介
- 日记 [2007年08月29日]
- WebView的白屏检测与处理