c++实现_Kruskal算法(最小生成树算法)

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

using namespace std;
typedef pair<int, int> iPair;
struct Graph {
	int V, E;//V:the number of the vertices
			 //E:the number of edges
	vector<pair<int, iPair>> edges;

	Graph(int V, int E) {
		this->V = V;
		this->E = E;
	}
	void addEdge(int x, int y, int w) {
		edges.push_back({w,{x,y}});
	}
	int caculate_mst();
};
struct disjointSets {
	vector<int> parent, rank;
	int n;
	disjointSets(int n){
		this->n = n;
		parent = vector<int>(n, -1);
		rank = vector<int>(n, -1);
	}
	int find_root(int x) {
		int x_root = x;
		while (parent[x_root] != -1)
			x_root = parent[x_root];
		return x_root;
	}
	bool union_vertices(int x, int y) {
		int x_root = find_root(x);
		int y_root = find_root(y);
		if (x_root == y_root)
			return false;
		else {
			if (rank[x_root] > rank[y_root])
				parent[y_root] = x_root;
			else if (rank[y_root] > rank[x_root])
				parent[x_root] = y_root;
			else {
				parent[x_root] = y_root;
				rank[y_root] += 1;
			}
		}
		return true;
	}
};
int Graph::caculate_mst() {
	int mst = 0;
	disjointSets ds(V);
	sort(edges.begin(), edges.end());
	for (auto it = edges.begin(); it != edges.end(); it++) {
		int x = it->second.first;
		int y = it->second.second;
		int x_root = ds.find_root(x);
		int y_root = ds.find_root(y);
		if (ds.union_vertices(x_root, y_root)) {
			cout << x << "-" << y << endl;
			mst += it->first;
		}
	}
	return mst;
}
int main() {
	int V = 9, E = 14;
	Graph g(V, E);
	
	g.addEdge(0, 1, 4);
	g.addEdge(0, 7, 8);
	g.addEdge(1, 2, 8);
	g.addEdge(1, 7, 11);
	g.addEdge(2, 3, 7);
	g.addEdge(2, 8, 2);
	g.addEdge(2, 5, 4);
	g.addEdge(3, 4, 9);
	g.addEdge(3, 5, 14);
	g.addEdge(4, 5, 10);
	g.addEdge(5, 6, 2);
	g.addEdge(6, 7, 1);
	g.addEdge(6, 8, 6);
	g.addEdge(7, 8, 7);


	int mst = g.caculate_mst();
	cout << "mst=" << mst;
	return 0;
}

 

Kruskal算法求解最小生成树(c++实现) 原问题的地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=38,该问题本质上是求最小生成树的问题,输入输出部分没有严格遵守题目的要求, 阅读详情

相关推荐

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

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

老夫编代码就是一把梭 1476

并查集---判断图中是否存在环

算法描述:并查集(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数、最小公共祖先、带限制的作业排序,还有最完美的应用:实现Kruskar算法求最小生成树。算法实现://并查集判断是否存在环 #include <iostream> #include <stdlib.h> #inclu

爱橙子的OK绷的专栏 3324

Kruskal最小生成树算法的C++实现

每个边都带有一个整数权值(edge_weight_t),存储在property中。kruskal_minimum_spanning_tree算法返回一个vector,它包含最小生成树的所有边。总之,Boost C++库的kruskal_minimum_spanning_tree算法是一个很方便的工具,用于计算无向连通图的最小生成树,尤其对于大型复杂图形结构来说,代码简洁明了,易于理解和使用。在图论中,最小生成树是指连接一个无向连通图的所有n个节点(顶点)的n-1条边,且这些边的权值之和最小的树。

HackVibe的博客 266

有向图找环( 并查集 )

假设有一条 x−>yx->yx−>y 的有向边,当建立连接时,更新xxx的父节点,同时更新xxx 到父节点的距离 len[x]=len[y]+1len[x]=len[y]+1len[x]=len[y]+1 若父节点相同说明存在环,环的大小为 len[x]+len[y]+1。len[x]+len[y]+1。len[x]+len[y]+1。 #include<bits/stdc++.h> #define LL long long #define pii pair<LL,LL&

qhq889的博客 3928

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

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

weixin_35935514的博客 888

Kruskal算法动态演示:最小生成树的C++实现

在当今的计算机科学和信息工程领域,图论算法是构建高效系统不可或缺的部分。Kruskal算法作为寻找最小生成树的一种经典方法,广泛应用于网络设计、电路布线、社区分析等领域。理解Kruskal算法,不仅有助于提升图论算法设计能力,还能进一步探索其在现实问题中的应用潜力。Kruskal算法的核心目标是在加权连通图中找到一个最小生成树,使得树包含图中的所有顶点,并且所有边的权值之和最小。最小生成树的概念在计算机网络的布线成本优化以及交通规划等领域中有着极其重要的应用价值。

weixin_42298778的博客 439

检测有向图和无向图中的环

有向图和无向图的环检测 1.无向图 可以用DFS检测,思想是,DFS过程,记录当前结点的父结点,如果某结点以及访问过且不是该结点的父结点,则存在环

myblog 991

QGroundControl或者华科尔地面站安装完打不开问题解决

QGroundControl 华科尔 打不开

wv112406的博客 4915

并查集-求有向图中是否有环

java刷题:简单介绍一下并查集,并利用并查集查看有向图是否存在至少一个环

Nelson_hehe的博客 1859

Windows打印体系结构之Windows内置打印驱动程序

时间是一种很残酷的东西,它只会冲淡能够冲淡的,但也会洗尽铅华帮你留下该留下的。1.3.4、Windows内置打印驱动程序现在的Windows下的打印机驱动程序通常分为V4打印机驱动程序(V4 Printer Driver)、XPS打印机驱动程序(XPSDrv)、微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)、微软PostScri...

weixin_34309435的博客 2254

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

m0_68167062的博客 2262

并查集判断图中是否存在环

以前听并查集的时候没好好听,导致做题一直没能彻底搞懂,今天在B站上听了灯笼哥的详细讲解,算是彻底搞懂了。 传送门:https://www.bilibili.com/video/av38498175/?p=1 假如题目要求读入n,m分别为顶点数和边的条数,并且下面m行跟着图中每条边的起点和终点,求判断此图中是否存在环 #include<bits/stdc++.h> usi...

追风者 1865

银河麒麟V10 SP3离线安装Nginx1.21.5全记录(附11个rpm包下载清单)

本文详细记录了在银河麒麟V10 SP3操作系统上离线安装Nginx 1.21.5的全过程,包括11个必备rpm包的下载清单。通过分步骤的实战指南,帮助用户在国产化环境中高效部署Nginx服务,涵盖安装、配置、调优及故障排查等关键环节,特别适合金融、政务等对安全性要求高的场景。

weixin_30872337的博客 606

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

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

疯狂的指针的博客 1万+

k8s集群部署私有镜像仓库

本文介绍了在Kubernetes集群中部署私有镜像仓库的完整方案。使用registry:2镜像创建Deployment,通过NodePort(30500)暴露服务,并采用hostPath(/data/registry)实现数据持久化。部署过程包括节点标记、YAML配置、资源创建及验证步骤,同时提供了Docker和Containerd两种环境下的详细使用方法,包括配置不信任私有仓库、镜像推送/拉取操作指南。该方案特别适合开发测试环境,为团队提供便捷的本地镜像管理能力。

weixin_42728286的博客 893

Nature Communications|马兰戈尼效应构建空心金字塔微阵列制备高灵敏度柔性电容式压力传感器(健康监测/柔性压力传感/柔性电子/人机交互)

三维(3D)微结构因其在柔软性、轻质化、对3D表面的贴合性和可压缩性方面的显著优势,已经在生物医学监测、人机接口、机器人触觉和微型飞行器等领域引起了广泛关注。柔性电容式压力传感器(CPSs),由两片平行板组成,中间夹着一层软介电薄膜,具有设备构造简单、高灵敏度和快速响应速度等众多吸引人的优点。结构化介电层的三维机械设计在决定传感器性能方面起着至关重要的作用,如灵敏度(这是压力传感器的关键特性,因为它决定了感知微小压力和获取更多细节的能力,如轻柔触摸和脉搏检测)。

感知科学前沿 526

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

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

keith66的博客 603

Simulink仿真模块 -Scope

如果您将 Scope 模块放在具有锁定链接的库或者锁定的库中,当尝试打开示波器窗口时,Simulink 会显示错误。要显示某个库模块中的内部数据,请为库模块添加一个输出端口,然后将此端口连接到您模型中的 Scope 模块。当您在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。当在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。如果在仿真开始时波形视图关闭,则当在仿真后打开波形视图时,波形视图将显示附加的输入信号的仿真结果。

jk_101的博客 3792

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

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

weixin_41427400的博客 2820

【单片机】STM32F103C8T6 最小系统板原理图

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,由STMicroelectronics(ST)公司生产。它是STMicroelectronics的STM32系列微控制器中的一员,被广泛应用于嵌入式系统和电子设备中。LQFP48封装(Low-profile Quad Flat Package,48引脚)SRAM(静态随机访问存储器):20 KB。支持JTAG调试和编程接口(可选)多个通用输入/输出口(GPIO)USB接口(用于USB设备模式)内置调试和编程接口(SWD)

q742971636的博客 6万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

Ycy的博客 1904

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

二哈 3853

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

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

最小生成树Kruskal算法实现C++实现

// Kruskal算法实现.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #define MAX 100 typedef int WeiType; using namespace std; // struct Edge { int no; //边的序号 int

JAVAweb学习 518

Kruskal算法计算最小生成树 C++实现

用Kruskal算法计算最小生成树时,将结点分成不同的集合,一开始所有的结点都在不同的集合 将所有的边排序后(按照权值进行从小到大排序) 然后看每边的两个结点是否属于不同集合, 如果不是,则可以将这条表加到最小生成树中,并把这两个结点放到同一个集合中,然后如此类推, 直到最小生成树中有了n-1条边 测试用例: 上面说的那个集合,我用两个map来实现,好久没敲C++的代码...

247

图文详解最小生成树算法并利用并查集实现Kruskal算法(C++实现)

最小生成树Prim算法Kruskal算法 最小生成树即在连通图中用n-1条边连接全部n个顶点,生成无环路的树形结构,并使得连接边的权值之和最小。 我们介绍最小生成树的经典算法:普里姆算法和克鲁斯卡尔算法。 Prim算法 普里姆算法从图的一个顶点出发,将此顶点归入集合,并不断选取图中其他顶点到已添加顶点的最短路径,将添加的最短路径归入最小生成树中,待所有顶点归入集合,即生成n个顶点n-1条边的最小生成树。 //针对图的邻接矩阵的普里姆算法 void MiniSpanTree_Prim(MGraph G) {

qq_45929428的博客 1252
上一篇: SQL之DATEDIFF函数
下一篇: c++实现_堆排序
SmartDemo
博客等级 码龄9年 176粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值