概要:

  1. Prim算法
  2. 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

图的算法专题——最小生成树相关推荐

  1. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  2. ds图—最小生成树_Java: Kruskal算法生成最小生成树(邻接矩阵)

    Java: Kruskal算法生成最小生成树(邻接矩阵): package 输出: Kruskal=36: (E,F) (C,D) (D,E) (B,F) (E,G) (A,B) 分析: Java: ...

  3. 数据结构之图的应用:最小生成树MST(prime算法和Kruskal算法)

    图的应用:最小生成树 最小生成树的定义: 最小生成树的性质: Prime算法:(贪心算法思想) Prime算法的代码实现原理: Prime算法的实现代码: Prime算法的性能: Kruskal算法: ...

  4. 算法训练营 图的应用(最小生成树)

    最小生成树 子图:从原图中选中一些由节点和边组成的图,称之为原图的子图. 生成子图:选中一些由边和所有节点组成的图,称之为原图的生成子图. 生成树:如果生成的子图恰好是一棵树,则称之为生成树. 最小生 ...

  5. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  6. 三十七、Prim算法--求解最小生成树

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

  7. 算法专题(1)-信息学基本解题流程!

    算法专题(1)-信息学基本解题流程! [文章来源:清北学堂微信订阅号noipnoi] 摘要 本次系列文章主要介绍信息学以下知识点 今天我们主要看信息学基本解题流程: 一. 基本解题流程 1.概述: 信 ...

  8. prim算法 求最小生成树

    最小生成树Prim算法理解 标签: Prim算法理解最小生成树Prim 2014-08-16 18:49 18482人阅读 评论(5) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  9. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

最新文章

  1. 微软新员工吐槽:技术含量一般,好后悔拒绝了阿里,感觉要废掉
  2. 实例创建流程_Activiti系列~3.流程定义
  3. 和plc哪个简单点_怎么看PLC梯形图
  4. php sqlserver扩展,PHP---连接sqlserver扩展配置
  5. scala的传值参数和传名参数
  6. ubuntu下面codelite运行代码一闪而过的问题、codelite的代码排版快捷键、去掉xfce4的Ctrl+F5
  7. 如何构建低延时直播体验,让互动更实时?
  8. java8(2)--- Stream API
  9. java 集群会话管理_架构设计之Spring-Session分布式集群会话管理
  10. Leetcode 169 Majority Element
  11. webpack+Vue2.0项目基础工程文件配置
  12. 力扣题目——107. 二叉树的层序遍历 II
  13. 获取FileUpload上传的文件大小
  14. java 设计模式学习笔记四 prototype模式
  15. 云莲MK8215_联芸MAS0902固态硬盘开卡教程,量产工具软件下载
  16. AI算法模型线上部署方法总结
  17. Mybatis多表新增
  18. java技术--报警通知及实现方式
  19. matlab抢占时隙算法,基于汉明重分组的动态帧时隙ALOHA防碰撞算法
  20. windows服务器上无法运行bat文件,ad域用户bat脚本运行不了

热门文章

  1. 设计模式——单例模式(Singleton)
  2. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用50
  3. 超市购物打印小票的简单程序 记录下来
  4. python模拟高并发_Python基于gevent实现高并发代码实例
  5. mysql挂科了咋办_大一挂科很难受怎么办?
  6. php列表显示教程,Dedecms后台管理文档列表显示自定义字段方法教程
  7. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载
  8. vuex的命名空间有哪些_专业餐饮全案策划设计公司报价?具体做哪些服务?
  9. c语言指针实现字符串倒序输出,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  10. 平年闰年c语言源代码,C语言平年闰年问题