最小生成树-kruskal c++算法 总结

C++最小生成树(kruskal算法,prim算法) 生成树是一种特殊的连通子图,它在保持图中所有顶点的同时,只包含了构成一棵树的边数,即n-1条边,其中n是图中的顶点数量。生成树是无环的,并且是连通的,这意味着通过生成树可以从任何一个顶点到达其他任何顶点,而不需要回溯或形成环路。权值最小的生成树称为最小生成树。 阅读详情

首先,什么是kruskal算法:

克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个。这里面充分体现了贪心算法的精髓。大致的流程可以用一个图来表示。这里的图的选择借用了Wikipedia上的那个。非常清晰且直观。

首先第一步,我们有一张图,有若干点和边

第一步我们要做的事情就是将所有的边的长度排序,用排序的结果作为我们选择边的依据。这里再次体现了贪心算法的思想。资源排序,对局部最优的资源进行选择。

排序完成后,我们率先选择了边AD。这样我们的图就变成了

.

.

.

.

.

.

第二步,在剩下的边中寻找。我们找到了CE。这里边的权重也是5

.

.

.

.

.

.

依次类推我们找到了6,7,7。完成之后,图变成了这个样子。

.

.

.

.

.

.

下一步就是关键了。下面选择那条边呢? BC或者EF吗?都不是,尽管现在长度为8的边是最小的未选择的边。但是他们已经连通了(对于BC可以通过CE,EB来连接,类似的EF可以通过EB,BA,AD,DF来接连)。所以我们不需要选择他们。类似的BD也已经连通了(这里上图的连通线用红色表示了)。

最后就剩下EG和FG了。当然我们选择了EG。最后成功的图就是下图:

.

.

.

.

.

.

到这里所有的边点都已经连通了,一个最小生成树构建完成。

Kruskal算法的时间复杂度由排序算法决定,若采用快排则时间复杂度为O(N log N)。

其实就是不断取最小边,判断是否可行,从某种程度上来说是“贪心”

判断是否可行便要使用并查集(这里就不说了);

做了不少题目,总结kruskal算法的几种题型:

1.最基础的,简单的,直接套就行;

2.有添加条件,可以减少连接边的题型,只需读懂题目便行(如无线通讯网);

3.需要自己计算(获取)边的长度的题,像矩阵,坐标系一类的;

4.不是取最短路径,而是第二短,第n短一类的(important):

Problem D: 秘密的奶牛管道

Time Limit: 1000 ms    Memory Limit: 128 MB

Description

Description
    约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线。一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式。
现在有W(3 <= W <= 2000)个供水站,其中最多有P(P <= 20,000)条管道,每一条管道连接了两个水站,并且不存在一条管道连接同一个水站,两个水站之间最多只有一条管道。每条管道有一定的费用。请寻找第二便宜的连接方式,使所有的水站相连。
假设最便宜的方案有且只有一种,并且至少有两种可行的连接方案。所有的费用都不超过16位有符号整数。水站用1到W的自然数表示。


Input
    第一行:两个数W和P
第2~P+1行:每行描述了一条管道,有3个用空格分开的整数,前两个数表示管道连接的两个端点。第3个数是管道的费用。


Output
    仅一行,第二便宜的管道铺设费用。


Sample Input
5 7
1 2 3
2 3 4
1 4 7
2 4 11
2 5 9
5 4 5
3 5 8

Sample Output
20

这题需要得出最短路径,然后再删除该路径任意一条边,再求一次,循环n-1次,得出第二短路径

 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct pipe{
int s,e,w;
}p[20005];
int f[2005];
int m,n;
bool pdd[20005];
bool comp(const pipe a,const pipe b){
return a.w<b.w;}
int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);}
int main()
{std::ios::sync_with_stdio(false);
int i;
    cin>>m>>n;
for(i=1;i<=n;i++)
cin>>p[i].s>>p[i].e>>p[i].w;
sort(p+1,p+1+n,comp);
int ans=m-1,wal=0;  
for(i=1;i<=m;i++) f[i]=i;
for(i=1;i<=n;i++)
{int fx=find(p[i].s);
  int fy=find(p[i].e);  
if(fx!=fy){
f[fy]=fx;ans--;wal+=p[i].w;pdd[i]=true;}
if(ans==0) break;
}int maxn=wal;//找最短;
int sum=20005*2000;
bool pd[n+1];
for(int j=1;j<=n;j++)//一条一条边试着删;
if(pdd[j])
{memset(pd,true,sizeof(pd));
pd[j]=false;
for(i=1;i<=m;i++) f[i]=i;
ans=m-1,wal=0;  
for(i=1;i<=n;i++)//再求最短;
{int fx=find(p[i].s);
  int fy=find(p[i].e);  
if(fx!=fy && pd[i]==true){
f[fy]=fx;ans--;wal+=p[i].w;}
if(ans==0) break;
}
if(wal<sum/* && wal>=maxn*/) sum=wal;
}
cout<<sum<<endl;
return 0;
}

————————————————————————————————————————————————————

以上便是全部总结。

未来补充,有补充也可以评论;

只要善于思考,一切题型一定可以迎刃而解的!!!!!!!!!



C++最小生成树Kruskal算法 Kruskal算法是求解无向有权图的最小生成树的一种渐进时间复杂度为O(n+eloge)算法(如果用小根堆进行排序的话),它利用了贪心策略:每次寻找权值最小的边加入集合,且这个边的加入不会产生回路。详细的算法步骤分析,参照https://blog.youkuaiyun.com/mgsky1/article/details/77840286 #include&lt;iostream&gt; #include... 阅读详情

相关推荐

Kruskal算法求解最小生成树(c++实现)

原问题的地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=38,该问题本质上是求最小生成树的问题,输入输出部分没有严格遵守题目的要求,

第二不及的专栏 1064

最小生成树算法--Kruskal精讲(图文并茂)

Kruskal算法 1.概览 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。 2.算法简单描述 1).记Graph中有v个顶点,e个边 2).新建图Graphnew,Graphn...

BigData_Mining的博客 2495

最小生成树,Prim,Kruskal算法主要思想,证明及C++实现

最小生成树: 任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通).加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和.最小代价生成树是其所有生成树中代价最小的生成树。 实现最小生成树的算法常用的是Prim,Kruskal学校数据结构的书上讲解了这两大算法的思路及用C++实现,但关于其合理性的证明却略过去了,这里主要加上我自己的一些总结,证明一下,最后写个模版用。 P

/ 9479

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

最小生成树的Kruskal算法 一、 什么是最小生成树 1.1 最小生成树定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 1.2 例子: 通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离 1.3 理解 最小生成树: 将最小生成树拆分成: 最小 生成 树 树: • 树中没有环 • 所有的顶点都要在树中 • 对于N条

DUdU_23456的博客 2万+

数据结构之图---最小生成树Kruskal算法---C++实现

一、需求图Kruskal算法最小生成树 无向图中点与点之间,边上的数字表示权值。 二、实现Kruskal算法最小生成树 1.边的描述 定义边的对象时应有以下属性:这条边连接两端的点(nodeIndexA,nodeIndexB),边的权值,以及这条边是否被选中 2.图的描述 上述1,2与Prim算法一致见: 数据结构之图---最小生成树Prim算法---C++实现

老夫编代码就是一把梭 1476

最小生成树kruskal算法_C++详解

一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择n−1条,将所有顶点连通。:我们定义无向连通图的 最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树。

m0_54615144的博客 700

图详解第三篇:最小生成树(Kruskal算法+Prim算法)

最小生成树:Kruskal算法+Prim算法

m0_70980326的博客 2万+

掌握最小生成树:Prim与Kruskal算法C++实现

最小生成树是图论中的一个重要概念,在解决网络设计和优化问题时具有广泛的应用。所谓最小生成树,是指在一个加权无向图中找到一个子图,该子图包含图中所有顶点,并且边的权值之和最小。理解最小生成树的概念对于掌握后续章节中将要讨论的Prim算法和Kruskal算法至关重要。最小生成树的定义简单明了:对于一个具有N个顶点的连通加权无向图,其最小生成树是一棵包含所有N个顶点的树,且所有边的权重之和最小。最小生成树具有以下性质:最小生成树包含图中所有的顶点。最小生成树是一棵树,即不存在环。

weixin_35935514的博客 888

超容易理解的对最小生成树(MST性质)的全面阐述!最小生成树总结!Kruskal算法及Prim算法。

文章目录最小生成树总结1. 基本原理:2. 基本模式3. 问题的关键4. 寻找安全边的规则:4.1 基本概念4.2 添加安全边的定理准则MST性质的证明及图片解释5. 分类:5.1 Kruskal算法5.2 Prim算法 最小生成树总结 1. 基本原理: 贪心法;通用的算法都是采用这种贪心策略,它在每一个步骤中都形成最小生成树的一条边,算法维护一个变的集合A:保持以下的循环不变式:在每一次循环迭代之前,A是某个最小生成树的一个子集; 2. 基本模式 GENERIC-MST(G,w) A = Q

drtfyguhil的博客 4809

C++语言实现使用Prim(普利姆)算法求最小生成树

Prim算法是一种求解最小生成树问题的贪心算法。其基本原理是:每次从未被选择的顶点中选择一个距离当前生成树最近的顶点加入生成树,直到所有的顶点都被选择。 以下是Prim算法的详细步骤: 初始化:选取图中的任一顶点作为起始点,将其加入生成树中。对于每个顶点,初始化一个距离数组,用于存储当前生成树到该顶点的距离。同时,初始化一个访问数组,标记每个顶点是否已被访问。 开始循环:当生成树中顶点个数小于总顶点数时,执行以下步骤: a. 在所有未被访问的顶点中,选择距离最小的顶点,将其加入生成树中。 b. 更新距离数组:对于新加入生成树的顶点的所有邻居,如果从新顶点到邻居的距离小于从已访问的顶点到邻居的距离,则更新距离数组中该邻居的距离。 c. 标记新加入的顶点为已访问。 d. 将距离数组中等于无穷大的值(表示不可达)设为0,以便于后续选择新的顶点。 结束循环:当所有的顶点都被加入生成树中时,算法结束。 输出结果:输出生成树中的所有边和对应的权值。

记一次网络风暴/网络环路

环境: win10 x64 ,联想云教室,电子教室,华三交换机。 状况描述: 最开始开机,一直卡在PXE启动界面,进不去系统。电脑技术张工说,先开教师机后开学生机。因为学生机开机需要读取教师机的镜像。但是状况依旧。 开始排查网络,重启交换机后,发现陆续有几台电脑能登陆进系统桌面了,但很慢起码过了5分钟以上才能进去。 教师机一直都是正常的,然后我在教师机部署电子教室。技术说这电子 教室与云教室IP冲突。 (那之后我查了下这两款软件的PID和端口,所占端口不一样,那没冲突) 我说不可能吧,这套软件在

Nightwish5的博客 2864

数据结构C++——最小生成树之Prim算法和Kruskal算法

数据结构C++——最小生成树之Prim算法和Kruskal算法 文章目录数据结构C++——最小生成树之Prim算法和Kruskal算法一、最小生成树的基本概念二、最小生成树之Prim算法①Prim算法的实现原理②Prim算法中的Min函数的实现③Prim算法的代码实现④测试的完整代码三、最小生成树之Kruskal算法①Kruskal算法的实现原理②Krusal算法的代码实现③测试的完整代码四、总结 一、最小生成树的基本概念 最小生成树: 在一个连通网的所有生成树中,各边的代价之和最小的那棵生成树称为该连通网

qq_54162207的博客 8319

S参数反演法

等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式

weixin_43962864的博客 1万+

图论算法:最小生成树——Prim算法和Kruskal算法C++实现

前言:        这次我记录的是另外一种很有意思的东西——最小生成树。相信学过离散数学的朋友都对这种东西不陌生,那么在代码中,我们该如何实现它呢?接下来,我将对此讲解一些自己的心得。        开头让我插入一个Github传送门:JZX555的Github原理:      首先让我们看看什么是最小生成树——一个有n个节点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个节点,并且...

weixin_41427400的博客 2820

unity 腾讯地图sdk移动和缩放代码

unity 腾讯地图sdk 实现移动端 缩放 和 移动

。。。。。 1282

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

最小生成树之Kruskal和Prim算法——C++实现

很久以前就学过最小生成树之Kruskal和Prim算法,这两个算法很容易理解,但实现起来并不那么容易。最近学习了并查集算法,得知并查集可以用于实现上述两个算法后,我自己动手实现了最小生成树算法。 宏观上讲,Kruskal算法就是一个合并的过程,而Prim算法是一个吞并的过程,另外在Prim算法中还用到了一种数据结构——优先级队列,用于动态排序。由于这两个算法很容易理解,在此不再赘述。接下来给出我

疯狂的指针的博客 1万+

即插即用系列(代码实践)| 2025 Strip R-CNN:大尺寸条形卷积——遥感目标检测新SOTA,专治细长目标(桥梁、船只)

摘要: 论文《Strip R-CNN: Large Strip Convolution for Remote Sensing Object Detection》针对遥感图像中细长目标(如桥梁、道路)检测难题,提出创新性解决方案。通过设计StripBlock模块,将传统方形卷积核替换为大尺寸条形卷积(水平1×19与垂直19×1组合),有效捕获长距离空间特征,同时减少背景噪声。结合CenterPooling增强目标中心定位,该模块可即插即用至现有网络,显著提升遥感检测任务(如DOTA数据集)的精度。代码已开源,

分享顶会顶刊论文即插即用模块 189

C++实现的kruskal算法(最小生成树)

1. 求解最小生成树算法主要有两种,分别是prim算法与kruskal算法,下面使用的是C++语言实现的kruskal算法,之前使用Java语言描述Kruskal算法的时候已经比较详细了,博客地址为:https://blog.youkuaiyun.com/qq_39445165/article/details/9194905 2. 下面是具体的C++代码: #include<cstdio> ...

二哈 3852

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境

工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

让 SAP HANA 查询飞起来:彻底避开隐式类型转换的性能暗礁

SAP HANA性能优化:警惕隐式类型转换陷阱 隐式类型转换是SAP HANA项目中常见的性能隐患。当SQL表达式两侧数据类型不匹配时,系统会自动进行类型转换,这种看似便利的操作可能导致: 过滤条件无法下推,扫描范围扩大 列存引擎优势丧失,触发中间结果物化 执行计划走向低效路径 治理方案包括: 从源头统一数据类型,确保常用比较字段类型一致 将显式转换应用于常量而非整列 使用生成列预先转换存储,避免运行时计算 排查方法: 通过SQL Plan Cache定位高频查询 分析执行计划中的转换迹象 重点关注VARC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 11万+

最小生成树Prim与Kruskal 算法【C++实现】

1584. 连接所有点的最小费用 - 力扣(LeetCode)prim算法核心思路在于初始化边矩阵,设置一个最小距离数组和是否在树中的数组。

keith66的博客 603

135、高通 ChromaTix 调优工具入门:参数含义、调优流程与效果对比

本文介绍了高通ChromaTix色彩调优工具的核心使用要点:1. ChromaTix是位于ISP管线中的色彩处理系统,核心任务是将原始色彩映射为符合人眼感知的"舒适"效果;2. 重点解析了饱和度、色调、亮度相关饱和度等关键参数的实际含义和调试陷阱;3. 分享了四步调优流程,强调需要基于多场景数据验证;4. 通过案例展示了参数调整带来的色彩改善效果;5. 总结了实用建议,包括保持单一变量调试、量化评估色差、关注极端场景表现等。文章指出ChromaTix调优是平衡不同场景需求的"妥协艺术",需要结合客观数据和主

sundong_81的博客 106

C++ 图 Kruskal最小生成树算法

权值排序,依次取出,判断闭环 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <fstream> #include <sstream> #include <cassert> #include <vector> #in...

牛~ 294

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

图的最小生成树之Kruskal算法C/C++代码实现

克鲁斯卡尔Kruskal算法 : 1,该算法用到了排序算法,要求辅助数组按权值大小排序,代码中使用直接插入排序算法。 2,另外还需设置一个连通分量辅助数组,用来标识两个顶点是否在同一连通分量,因为我们要选择的是最小权值的边且边连接的两个顶点在不同连通分量的边。该算法也称“加边法”,所以克鲁斯卡尔算法更适合于求稀疏网的最小生成树。 还用上篇文章所用的图为例: 代码如下: #include<stdio.h> #define MaxInt 9 //定义无穷大,这里设置一个比所有边的权值都大的数

Ycy的博客 1904

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Kruskal算法求最小生成树的c++代码实现

kruskal算法是一类适用于稀疏图的最小生成树算法,主要思想也很简单,将所有的边分为 属于生成树的边S和不属于的V-S ,每次在V-S中找一个权值最小的边放入S中,同时该边不构成回路,关于是否构成回路,可以使用并查集来判断。比如 上图中假如{1,2} , {1,3}都已经属于,那么unionSet[3]  = unionSet[2] = unionSet[1] = 1;这时如果想加入{

努力学挖掘机的李某某的博客 3600

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 寻找道路 【gzoi】
下一篇: 二维动规小结
Wyt_code
博客等级 码龄9年 10粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值