转载请注明来源

最小生成树简单的来说就是从无向连通图的邻接表或者邻接矩阵中扣下来一棵权值最小的树,他只有n-1条边来连接n个顶点,并且不允许产生回路。

Kruskal算法首先要对边进行排序,sort一遍升序即可。然后要进行的就是抠树啦。最开始的时候把n个点看成独立的n棵树,然后按权值从小到大选择边,所选的边连接的两个顶点u,v应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。 重复直到所有顶点都在一颗树内或者有n-1条边为止

求最小生成树要用到之前学过的并查集

参考:https://blog.csdn.net/luoshixian099/article/details/51908175

下面贴上代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define fio ios::sync_with_stdio(false);cin.tie(0);
#define pii pair<int,int>
#define vi vector<int>
#define vc vector<char>
#define pi 3.1415926
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1const int INF=0x3f3f3f3f;
const int N=2e5+5;typedef long long ll;
typedef double db;
typedef unsigned long long ull;
using namespace std;int n,m;
int pre[N];struct edge
{int start;int to;int value;
}edges[N];void InitPre()//初始化pre数组
{for (int i=1;i<=n;i++){pre[i]=i;}
}int findRoot(int n)//查找根节点
{int r=n;while(pre[r]!=r)//查找这个点的根节点
    {r=pre[r];}//r现在是根节点int i=n,j;while(i!=r)//路径压缩,让小弟直接归老大直辖
    {j=pre[i];pre[i]=r;i=j;}return r;
}void join(int x,int y)//把各个连同分支连起来
{int r1=findRoot(x);int r2=findRoot(y);if(r1!=r2)//如果已经连通不用管
    {pre[r1]=r2;//不连通的时候随便指定一个是另一个的老大
    }
}bool cmp(edge a,edge b)
{return a.value<=b.value;
}void kruskal()
{int sumValue=0;//生成树的权值int cnt=0;//已用边的数量int start,to,value;for (int i=1;i<=m;i++){start=edges[i].start;to=edges[i].to;if(findRoot(start)!=findRoot(to)){cout<<start<<"---"<<to<<" "<<edges[i].value<<endl;sumValue+=edges[i].value;cnt++;join(start,to);}if(cnt>=n-1) break;}cout<<"SumValue: "<<sumValue<<endl;
}int main()
{//n个点m条边cin>>n>>m;InitPre();for (int i=1;i<=m;i++){cin>>edges[i].start>>edges[i].to>>edges[i].value;}sort(edges+1,edges+1+m,cmp);cout<<endl<<endl;kruskal();
}

测试数据

7 9
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24

--------------------------------------------------------------------

更新一波,这个板子在一些数据下面会T掉,可能某些方面写的不好。。

重新贴一个

 1 #include <bits/stdc++.h>
 2 #define fi first
 3 #define se second
 4 #define pb push_back
 5 #define fio ios::sync_with_stdio(false);cin.tie(0);
 6 #define pii pair<int,int>
 7 #define vi vector<int>
 8 #define vc vector<char>
 9 #define pi 3.1415926
10 #define ls l,m,rt<<1
11 #define rs m+1,r,rt<<1|1
12
13 const int INF=0x3f3f3f3f;
14 const int N=2e5+5;
15
16 typedef long long ll;
17 typedef double db;
18 typedef unsigned long long ull;
19 using namespace std;
20 struct Edge
21 {
22     int u,v,w;
23 }edge[200005];
24
25 int fa[5005],n,m,ans,eu,ev,cnt;
26 inline bool cmp(Edge a,Edge b)
27 {
28      return a.w<b.w;
29 }//快排的依据
30 inline int findRoot(int x){
31     while(x!=fa[x]) x=fa[x]=fa[fa[x]];
32     return x;
33 }
34 inline void kruskal(){
35     sort(edge,edge+m,cmp);//将边的权值排序
36     for(int i=0;i<m;i++){
37         eu=find(edge[i].u), ev=find(edge[i].v);
38         if(eu==ev) continue;//若出现环,则continue
39         ans+=edge[i].w;//更新答案
40         fa[ev]=eu; cnt++;
41         if(cnt==n-1) break;//循环结束条件
42     }
43 }
44 int main(){
45     scanf("%d%d",&n,&m);
46     for(int i=1;i<=n;i++) fa[i]=i;//初始化并查集
47     for(int i=0;i<m;i++)
48         scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
49     kruskal();
50     printf("%d",ans);
51     return 0;
52 }

转载于:https://www.cnblogs.com/TheSilverMoon/p/9309772.html

最小生成树学习-Kruskal算法相关推荐

  1. 最小生成树:Kruskal算法 和 Prim算法(第23章)

    武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...

  2. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  3. 数据结构------最小生成树之Kruskal算法

    盛年不重来,一日难再晨.及时当勉励,岁月不待人. <杂诗>陶渊明 目录 前言 一.Kruskal的几何思维 二.使用步骤 1.核心思想 2.全部测试代码 总结 前言 最小生成树算法有两种一 ...

  4. 最小生成树的Kruskal算法-详解

    最小生成树的Kruskal算法 一. 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最 ...

  5. kruskal算法c语言,最小生成树之Kruskal算法

    上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...

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

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

  7. python【数据结构与算法】最小生成树之Kruskal算法

    我们用现在来模拟一下Kruskal算法,下面给出一个无向图B,我们使用Kruskal来找无向图B的最小生成树. 首先,我们将所有的边都进行从小到大的排序.排序之后根据贪心准则,我们选取最小边(A,D) ...

  8. 最小生成树之Kruskal算法

    图片描述 算法思想 采用贪婪策略,连续的按最小的权选择边,并且当边不产生圈时就把它作为取定的边 算法思路 问题出现 1.怎样选择最小权的边 用个排序算法 2.怎样判断加入的边是否会产生圈 (用到不相交 ...

  9. 最小生成树(Kruskal算法+Prim算法)简单讲解+最小生成树例题 acm寒假集训日记22/1/8

    算法简讲部分: Kruskal算法: 基于贪心策略大致过程分为第三步:1. 我们先用结构体把每条边的端点和权值记录下来,然后对每条边按权值进行排序2. 因为 使图连通最少需要n-1 条边,所以我们依次 ...

最新文章

  1. 字节跳动算法刷题宝典.pdf
  2. php无限极下拉框,php递归实现无限分类生成下拉列表的函数
  3. 全美第二的机器人项目核心数学课免费开放,院长亲自授课,作业讲义全同步...
  4. bo a1 蓝牙音箱 中文说明
  5. Mediasoup简介及其基本概念
  6. GoF--服务定位器模式
  7. SpringCloud学习笔记(十)----服务熔断与限流 Sentinel
  8. Kotlin 条件控制(六)
  9. 自动化神经网络理论进展缓慢,AutoML 算法的边界到底在哪?
  10. python更改端口
  11. AddHandler php5-script .php\AddType text/html .php和AddType application/x-httpd-php .php的区别?...
  12. java 并发包脑图
  13. 空间中直线到平面的距离的公式是什么?
  14. Android照片墙应用实现,再多的图片也不怕崩溃
  15. samba文件共享服务器,全网最详细的samba文件共享服务!
  16. 【USACO题库】1.5.4 Checker Challenge跳棋的挑战
  17. 【C++】上下取整取整函数
  18. DTV_SI 汇总 兼谈LCN
  19. 基于STM32H743的APDS-9930调试心得
  20. Bi-directional Cross-Modality Feature Propagation with Separation-and Aggregation Gate_eccv2020

热门文章

  1. MySql 数据库 - 安装时提示缺失VCRUNTIME140_1.dll文件导致的无法启动此程序解决方法,vc++2015-2019运行库集合包获取
  2. css,css,javascript实现一个简单的计算器
  3. 联合体在单片机中的应用
  4. 万向锁的简单数学解释
  5. java8 lambda 排序算法,Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)...
  6. Python高效画饼图
  7. php非,PHP实现非对称加密
  8. 在Python中使用SMTP发送电子邮件
  9. Java-Runoob-高级教程-实例-字符串:13. Java 实例 - 字符串格式化
  10. XML和实体类之间相互转换(序列化和反序列化)