动画参考视频:最小生成树(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)相关推荐

  1. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

  2. 【数据结构与算法】普里姆算法的介绍和修路问题程序实现

    目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...

  3. prim算法(普里姆算法)详解

    prim算法(普里姆算法)详解 了解了什么是最小生成树后,本节为您讲解如何用普里姆(prim)算法查找连通网(带权的连通图)中的最小生成树. 普里姆算法查找最小生成树的过程,采用了贪心算法的思想.对于 ...

  4. 两种构造最小生成树的算法(普里姆算法,克鲁斯卡尔算法)

    (一)普里姆算法 普里姆算法求最小生成树:从生成树中只有一个顶点开始,到定点全部进入生成数为止: 2.克鲁斯卡尔算法. 思想:将所有边按其权值从小到大排一遍,从小到大依次选取边,加入最小生成树中,若加 ...

  5. 克鲁斯卡尔算法 与 普里姆算法

    克鲁斯卡尔算法 设G=(V,E)是具有n个顶点的连通网,T=(U,TE)是其最小生成树. 1.选取权值最小的边(Vi,Vj),若边(Vi,Vj)加入到TE后形成回路,则舍弃该边,否则将该边加入到TE中 ...

  6. 数据结构与算法|最小生成树算法(普里姆算法、克鲁斯卡尔算法)

    最小生成树算法 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 最小生成树算法 一.普里姆(Prim)算法 1.C语言代码 2.算法思路 二.克鲁斯卡尔(Kruskal)算法 1. ...

  7. 我所知道的十大常用算法之普里姆算法(最小生成树)

    前言需求 今天我们学习的是普里姆算法,我们还是从一个场景里引入看看 有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 1.各个村庄的距离用边线表示(权) ,比如 A ...

  8. 【算法】普里姆算法 Prim算法解决修路问题

    文章目录 1. 概述 1.1 最小生成树 2.普里姆算法介绍 3.代码 3.1 案例1 1. 概述 视频:https://www.bilibili.com/video/BV1E4411H73v?p=1 ...

  9. 十大算法之普里姆算法

    普里姆算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设G=(V,E)是连 ...

最新文章

  1. VS2010 CUDA 5.5 VA_X Win7 64位配置
  2. 企业管理做不好的根源!「管理智慧」
  3. C++11带来的全新数值和字符串转换函数
  4. showModalDialog sesission丢失
  5. setTimeOut与 setInterval区别
  6. ASP.NET性能优化小结(ASP.NETC#)(转)
  7. [react] 怎么定时更新一个组件?
  8. 使用 YOLOv5 训练自动驾驶目标检测网络
  9. 数组对象的reduce方法
  10. js 动态生成html(js根据后台返回数据生成html页面中的table标签)(转义字符)
  11. 眼图matlab仿真_MATLAB开发自动驾驶第二十课-自动驾驶场景设计器中的预建驾驶场景...
  12. vscode regex previewer插件怎么用_分享五款开挂神器!助你效率倍增!做PPT怎么能不会用插件?...
  13. Docker入门之安装MySQL
  14. 深度学习笔记其一:基础知识和PYTORCH
  15. 企业微信之发送应用消息案例
  16. 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
  17. 员工激励机制设计宝典
  18. MinIO集群怎么接入Prometheus监控?(上)
  19. 免费自学编程的12个网站,不用再花钱啦
  20. ogg转mp3格式转换器

热门文章

  1. 【橙子日记32】从零开始的毕业设计
  2. 字符串练习8-身份证号码信息查看
  3. Bounce.js-可视化CSS3动画代码生成js插件
  4. CocosCreator 屏幕适配
  5. 软件工程OOAD(面向对象的分析与设计)概念整理
  6. 1G内存JAVA程序优化
  7. 跟Howard学LESS之初见LESS
  8. html input提交按钮标签样式,html - 输入类型=“提交”Vs按钮标签是否可以互换?...
  9. SkyForm CMP管理异构资源池案例
  10. Maya 中动画切线的类型