克鲁斯卡尔算法(Kruskai)和普里姆算法(Prim)
动画参考视频:最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili
克鲁斯卡尔算法(Kruskai)
克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(eloge)
。和普里姆算法恰恰相反,更适合于求边稀疏的网的最小生成树。
思路步骤:
1、将边全部提取出来放入一个列表中,从权重小到大依次排序
2、将最小权重的边放入图中与对应的顶点相连
3、要确保边填入后不能形成环,如果形成环就丢弃这条边
4、知道加入了(n-1)条边最小生成树构造完成。(n是树中顶点的数量)
普里姆算法(Prim)
普里姆算法。该算法从顶点的角度为出发点,时间复杂度为O(n2)
,更适合与解决边的绸密度更高的连通网。
思路步骤:
1、从顶点开始出发,选择权重最小的边连接。
2、连接完新的顶点后继续找最小权重边,与已经连接的全部顶点所连接的边都要对比。
3、连接后判断是否形成环,形成的话则放弃,回退权重第二小的边以此类推。
代码没有完善仅供参考/* 参考的结构体
typedef struct Edgenode //邻接结点
{int adjvex; //邻接结点存储的数组下标 int weight; //用于存储权值,对于非网图可以不需要struct Edgenode *next; //链域,指向下一个邻接点
}Edgenode;typedef struct Vertexnode //顶点 表节点
{char data; //顶点域,存储顶点信息Edgenode *firstedge; //边表头指针
}Vertexnode,AdjList[Maxvew];typedef struct // 数组、顶点、边 结构体
{AdjList adjList; //顶点数组 int numVertexes,numEdges;//图中当前顶点数和边数
}GrapAdList;
*/ //以上仅供参考
// Prim算法生成最小数
void MIniSpanTree_prim(MGraph G)
{int min,i,j,k; int adjvex[MAXVEX]; //保存相关顶点下标 int lowcost[MAXVEX]; //保存相关顶点间边的权值 lowcost[0] = 0; //V0作为最小生成树的根开始遍历 , 权值为0 adjvex[0] = 0; //V0第一个加入 //初始化操作for(i=1;i<G.numVertexes;i++){lowcost[i]=G.arc[0][i]; //将邻接矩阵的第0行所有权值先加入数组 adjvex[i]=0; //初始化全部先为V0的下标 } //真正构造最小生成树的过程for(i=1;i<G.numVertexes;i++){min=INFINITY; // 初始化最小权值为 65535 等不可能数值 j=1;k=0;//遍历全部顶点while(j<G.numVertexes){//找出lowcost数组已储存的最小权值 if(lowcost[j]!=0 && lowcost[j]<min){min= lowcost[j];k=j; // 将发行的最小权值的下标存入k ,以待使用 }j++;} //打印当前顶点边中权值最小的边 printf("(%d,%d)",adjvex[k],k);lowcost[k]=0; //将当前顶点权值全部设置为 0 ,表示此顶点已经完成任务,进行下一个顶点的遍历 //邻接矩阵k行逐个遍历全部顶点 for(j=1;j<G.numVertexes;j++){if(lowcost[j]!=G.numVertexes;j++){lowcost[j]=G.arc[k][j];adjvex[j]=k;}}}
} //Kruskal算法最小生成树的过程
int Find(int *parent , int f)
{while(parent[f]>0){f=parent[f];}return f;
} void MIniSpanTree_Kruskal(MGraph G)
{int i,n,m;Edge edges[MAGEDGE]; //定义边集数组 int parent[MAXVEX]; //定义parent数组用来判断边与边是否形成环路 for(i=0;i<G,numVertexes;i++){parent[i]=0;}for(i=0;i<G,numEdges;i++){n=Find(parent,edges[i].begin);m=Find(parent,edges[i].end);if(n!=m) //如果n==m,则形成环路,不满足! {parent[n]=m;//将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树集合中 printf("(%d,%d) %d",edges[i].begin,edges[i].end,edges[i].weight);}}
}
克鲁斯卡尔算法(Kruskai)和普里姆算法(Prim)相关推荐
- 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
一.基础知识 有向图 无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...
- 【数据结构与算法】普里姆算法的介绍和修路问题程序实现
目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...
- prim算法(普里姆算法)详解
prim算法(普里姆算法)详解 了解了什么是最小生成树后,本节为您讲解如何用普里姆(prim)算法查找连通网(带权的连通图)中的最小生成树. 普里姆算法查找最小生成树的过程,采用了贪心算法的思想.对于 ...
- 两种构造最小生成树的算法(普里姆算法,克鲁斯卡尔算法)
(一)普里姆算法 普里姆算法求最小生成树:从生成树中只有一个顶点开始,到定点全部进入生成数为止: 2.克鲁斯卡尔算法. 思想:将所有边按其权值从小到大排一遍,从小到大依次选取边,加入最小生成树中,若加 ...
- 克鲁斯卡尔算法 与 普里姆算法
克鲁斯卡尔算法 设G=(V,E)是具有n个顶点的连通网,T=(U,TE)是其最小生成树. 1.选取权值最小的边(Vi,Vj),若边(Vi,Vj)加入到TE后形成回路,则舍弃该边,否则将该边加入到TE中 ...
- 数据结构与算法|最小生成树算法(普里姆算法、克鲁斯卡尔算法)
最小生成树算法 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 最小生成树算法 一.普里姆(Prim)算法 1.C语言代码 2.算法思路 二.克鲁斯卡尔(Kruskal)算法 1. ...
- 我所知道的十大常用算法之普里姆算法(最小生成树)
前言需求 今天我们学习的是普里姆算法,我们还是从一个场景里引入看看 有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 1.各个村庄的距离用边线表示(权) ,比如 A ...
- 【算法】普里姆算法 Prim算法解决修路问题
文章目录 1. 概述 1.1 最小生成树 2.普里姆算法介绍 3.代码 3.1 案例1 1. 概述 视频:https://www.bilibili.com/video/BV1E4411H73v?p=1 ...
- 十大算法之普里姆算法
普里姆算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设G=(V,E)是连 ...
最新文章
- VS2010 CUDA 5.5 VA_X Win7 64位配置
- 企业管理做不好的根源!「管理智慧」
- C++11带来的全新数值和字符串转换函数
- showModalDialog sesission丢失
- setTimeOut与 setInterval区别
- ASP.NET性能优化小结(ASP.NETC#)(转)
- [react] 怎么定时更新一个组件?
- 使用 YOLOv5 训练自动驾驶目标检测网络
- 数组对象的reduce方法
- js 动态生成html(js根据后台返回数据生成html页面中的table标签)(转义字符)
- 眼图matlab仿真_MATLAB开发自动驾驶第二十课-自动驾驶场景设计器中的预建驾驶场景...
- vscode regex previewer插件怎么用_分享五款开挂神器!助你效率倍增!做PPT怎么能不会用插件?...
- Docker入门之安装MySQL
- 深度学习笔记其一:基础知识和PYTORCH
- 企业微信之发送应用消息案例
- 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
- 员工激励机制设计宝典
- MinIO集群怎么接入Prometheus监控?(上)
- 免费自学编程的12个网站,不用再花钱啦
- ogg转mp3格式转换器