图的算法专题——最小生成树
概要:
- Prim算法
- Kruskal算法
1、Prim算法
算法流程:
(1)对图G(V,E)设置集合S来存放已被并入的顶点,然后执行n次(2)(3)
(2)每次从未并入顶点集合中选择与集合S最近的一个顶点,访问u并将其加入集合S,同时把这条离集合S最近的边加入最小生成树中。
(3)优化松弛
Prim算法与Dijkstra算法使用的思想几乎完全相同,只有在数组d[]的含义上有区别。(关于Dijkstra算法具体可以看前面写的《图的算法专题——最短路径》)
Dijkstra中d[]含义为起点s到达顶点Vi的最短距离,而Prim算法d[]含义为顶点Vi与集合S的最短距离,两者区别仅在于最短距离是到 起点 还是 集合 。
邻接矩阵版:
1 const int maxn=1000; 2 const int INF=1000000000; 3 int n,G[maxn][maxn]; 4 int d[maxm]; //顶点到集合S的距离 5 bool vis[maxn]={false}; 6 7 int prim(){ //默认0号为初始点,函数返回最小生成树的边权之和 8 fill(d,d+maxn,INF); 9 d[0]=0; 10 int ans=0; //边权之和 11 for(int i=0;i<n;i++){ 12 int u=-1,MIN=INF; 13 for(int j=0;j<n;j++){ 14 if(vis[j]==false&&d[j]<MIN){ 15 u=j; 16 MIN=d[j]; 17 } 18 } 19 if(u==-1) return -1; 20 vis[u]=true; 21 ans+=d[u]; //将与集合S距离最小的边加入最小生成树 22 for(int v=0;v<n;v++){ 23 if(vis[v]==false && G[u][v]!=INF && G[u][v]<d[v] ){ 24 d[v]=G[u][v]; //以u为中介点可以使v离集合S更近(u已被并入集合) 25 } 26 } 27 } 28 return ans; 29 }
邻接表版:
1 struct Node{ 2 int v,dis; //v为目标顶点,dis为边权 3 }; 4 vector<Node> Adj[maxn]; 5 int n,d[maxn]; 6 bool vis[maxn]={false}; 7 int prim(){ 8 fill(d,d+maxn,INF); 9 d[0]=0; 10 int ans=0; 11 for(int i=0;i<n;i++){ 12 int u=-1,MIN=INF; 13 for(int j=0;j<n;j++){ 14 if(vis[j]==false && d[j]<MIN){ 15 u=j; 16 MIN=d[j]; 17 } 18 } 19 if(u==-1) return -1; 20 vis[u]=true; 21 ans+=d[u]; 22 for(int j=0;j<Adj[u].size();j++){ 23 int v=Adj[u][j].v; 24 if(vis[v]==false && Adj[u][j].dis< d[v]){ 25 d[v]=Adj[u][j].dis; 26 } 27 } 28 } 29 return ans; 30 }
2、Kruskal算法
算法流程:
(1)对所有边权从小到大排序。
(2)按边权从小到大测试所有边,如果当前测试边所连接的两个顶点不在同一个连通块中,则并入,否则舍弃。 (运用并查集)
(3)循环执行(2)直到最小生成树的边数等于总顶点数减1或是测试完所有边时结束。若结束时边数不为顶点数减1,则图不连通。
1 const int MAXV=110; 2 const int MAXE=10010; 3 int father[MAXV]; 4 int findFather(int x){ 5 int a=x; 6 while(x!=father[x]){ 7 x=father[x]; 8 } 9 while(a!=father[a]){ 10 int z=a; 11 a=father[a]; 12 father[z]=x; 13 } 14 return x; 15 } 16 struct edge{ 17 int u,v; //边的两个端点编号 18 int cost; //边权 19 }E[MAXE]; 20 bool cmp(edge a,edge b){ 21 return a.cost<b.cost; 22 } 23 int kruskal(int n,int m){ //n为顶点个数,m为图的边数 24 int ans=0,Num_Edge=0; 25 for(int i=1;i<=n;i++) father[i]=i; //假设顶点范围为1到n 26 sort(E,E+m,cmp); 27 for(int i=0;i<m;i++){ //枚举边 28 int faU=findFather(E[i].u); 29 int faV=findFather(E[i].v); 30 if(faU!=faV){ 31 father[faU]=faV; 32 ans+=E[i].cost; 33 Num_Edge++; 34 if(Num_Edge==n-1) break; 35 } 36 } 37 if(Num_Edge != n-1) return -1; 38 else return ans; 39 }
转载于:https://www.cnblogs.com/Mered1th/p/10422955.html
图的算法专题——最小生成树相关推荐
- NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先
系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...
- ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)
Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...
- 数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)
图的应用:最小生成树 最小生成树的定义: 最小生成树的性质: Prime算法:(贪心算法思想) Prime算法的代码实现原理: Prime算法的实现代码: Prime算法的性能: Kruskal算法: ...
- 算法训练营 图的应用(最小生成树)
最小生成树 子图:从原图中选中一些由节点和边组成的图,称之为原图的子图. 生成子图:选中一些由边和所有节点组成的图,称之为原图的生成子图. 生成树:如果生成的子图恰好是一棵树,则称之为生成树. 最小生 ...
- 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法
大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...
- 三十七、Prim算法--求解最小生成树
一.Prim算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图 普利姆的算法如下: 设 ...
- 算法专题(1)-信息学基本解题流程!
算法专题(1)-信息学基本解题流程! [文章来源:清北学堂微信订阅号noipnoi] 摘要 本次系列文章主要介绍信息学以下知识点 今天我们主要看信息学基本解题流程: 一. 基本解题流程 1.概述: 信 ...
- prim算法 求最小生成树
最小生成树Prim算法理解 标签: Prim算法理解最小生成树Prim 2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...
最新文章
- 微软新员工吐槽:技术含量一般,好后悔拒绝了阿里,感觉要废掉
- 实例创建流程_Activiti系列~3.流程定义
- 和plc哪个简单点_怎么看PLC梯形图
- php sqlserver扩展,PHP---连接sqlserver扩展配置
- scala的传值参数和传名参数
- ubuntu下面codelite运行代码一闪而过的问题、codelite的代码排版快捷键、去掉xfce4的Ctrl+F5
- 如何构建低延时直播体验,让互动更实时?
- java8(2)--- Stream API
- java 集群会话管理_架构设计之Spring-Session分布式集群会话管理
- Leetcode 169 Majority Element
- webpack+Vue2.0项目基础工程文件配置
- 力扣题目——107. 二叉树的层序遍历 II
- 获取FileUpload上传的文件大小
- java 设计模式学习笔记四 prototype模式
- 云莲MK8215_联芸MAS0902固态硬盘开卡教程,量产工具软件下载
- AI算法模型线上部署方法总结
- Mybatis多表新增
- java技术--报警通知及实现方式
- matlab抢占时隙算法,基于汉明重分组的动态帧时隙ALOHA防碰撞算法
- windows服务器上无法运行bat文件,ad域用户bat脚本运行不了
热门文章
- 设计模式——单例模式(Singleton)
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用50
- 超市购物打印小票的简单程序 记录下来
- python模拟高并发_Python基于gevent实现高并发代码实例
- mysql挂科了咋办_大一挂科很难受怎么办?
- php列表显示教程,Dedecms后台管理文档列表显示自定义字段方法教程
- inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载
- vuex的命名空间有哪些_专业餐饮全案策划设计公司报价?具体做哪些服务?
- c语言指针实现字符串倒序输出,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
- 平年闰年c语言源代码,C语言平年闰年问题