Kruskal Algorithm 克鲁斯卡尔算法

news/2025/1/12 8:50:15/

Kruskal

首先 我们约定 n为节点数,m为边数

一、概念

Kruskal算法主要用于解决Minimum Spanning Trees(最小生成树)问题。

二、基本思想

先选择权值较小的边,检查是否存在回路,然后继续选择,直到选择了 n − 1 n-1 n1 的边结束。

三、模板代码

const int N=1005;//Nodes Count
const int M=2010;//Edges Count
int p[N];//p[i]记录节点 i 的父节点
int n;//顶点数
int res=0;
struct Edge
{int a;//Start Point of the edgeint b;//End Point of the edgeint v;//The Value of the edge
}edge[M];
int find(int x)//找到x的父节点
{return p[x]==x ? x : p[x]=find(p[x]);//等价于以下代码/*if(p[x]==x)//如果其父节点是其本身(它就是最nb的节点)return x;else p[x]=find(p[x]);//令x的父节点p[x]去寻找其父节点并赋值(路径压缩)       return find(p[x]); */
}
void merge(int x,int y)//将含x,y的两个集合合并成一个集合
{p[find(x)]=find(y);
}
bool cmp(Edge x,Edge y)//排序函数
{return x.v<y.v;    
}
int main()
{for (int i = 0; i < N; i++) p[i]=i;//初始每个节点的父节点都为自己//Input every edges info/* Code */sort(edge,edge+idx,cmp);//idx:边数int cnt=0;//记录已选择边的数量for (int i = 0; i < idx; i++)//枚举选择每条边{int x=edge[i].a,y=edge[i].b;if(find(x)!=find(y)) //没有成环{cnt++;merge(x,y);res+=edge[i].v;if(cnt==n-1) break;//如果题意可能不存在最小生成树,请依题意修改}}cout << res << endl;
}

四、实例题目

【习题】【最小生成树习题】LaoQiao C/C++ Group B 2020.4 9.通电
仅部分习题,若想了解更多习题请关注微信公众号或者博客。


如有疑问欢迎在评论区留言或者通过Email联系我

My Email:Wizzy-Ang@qq.com

欢迎大家关注我的个人公众号WizzyAngShare,(还有个人博客)

我会在这里分享编程语言语法,算法,及区块链的相关知识,还有各种奇奇怪怪的小知识等着你~

QRCode
虽然现在这个公众号有亿点草率 ,我会努力更新的~~~


http://www.ppmy.cn/news/246464.html

相关文章

Pytorch深度学习——Kaggle网站中泰坦尼克号作业(B站刘二大人P8作业)

目录 1 准备工作 2 具体代码 2.1 准备数据集 2.2 定义模型 2.3 定义损失函数和优化器 2.4 训练 2.5 测试 2.6 完整代码 3 注意 1 准备工作 先到Kaggle官网下载训练集和测试集&#xff0c;将数据集和测试集直接放在代码文件同路径下&#xff1a;如图所示&…

数据结构---克鲁斯卡尔(Kruskal)算法

数据结构&#xff08;C语言&#xff09;---克鲁斯卡尔&#xff08;Kruskal&#xff09;算法 一、总体思路二、代码实现步骤0.结构1.构建边集数组2.权值排序3.生成最小生成树 三、完整代码四、图解 一、总体思路 总体思路&#xff1a;以边构建 直接找最小权值的边来构建生成树&…

Kruskal算法(克鲁斯卡尔算法)

Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法&#xff0c;由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪心算法的应用。 概念解释 Kruskal算法定义&#xff1a;**先构造一个只含 n 个顶点、而边集为空的子图&…

Karger 算法简析

Karger 算法简析 概述 Karger算法是解决最小割问题的随机算法。当然&#xff0c;它是一个近似算法。虽然是近似算法&#xff0c;但它速度快&#xff0c;实现简单。 算法细节 一个直观的想法是&#xff0c;对于一个无向图 G G G&#xff0c;为找到它的最小割 ( S , T ) (S, …

卡尔曼(kalman)详解

Kalmanfliter [TOC](Kalmanfliter) kalman详解贝叶斯准则(Bayes rule)全概率定理贝叶斯卡尔曼matlab仿真 kalman详解 贝叶斯准则(Bayes rule) 全概率定理 两个随机变量 X 和 Y 的联合分布(joint distribution)如下: p (x , y) p (X x , Y y)&#xff08;Xx&#xff0c;Yy同…

算法之克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法 克鲁斯卡尔(Kruskal)算法&#xff0c;是用来求加权连通图的最小生成树的算法。 基本思想&#xff1a;按照权值从小到大的顺序选择n-1条边&#xff0c;并保证这n-1条边不构成回路 具体做法&#xff1a;首先构造一个只含n个顶点的森林&#xff0c;然后…

克鲁斯卡尔

版权声明&#xff1a;这就是我的文章啊 这一个算法。有点厉害。 首先&#xff0c;输入一个图&#xff0c;然后求它的最小生成树&#xff08;即一条最短的链&#xff0c;联通N个顶点&#xff09;。 (这就是图) 好的&#xff0c;然后&#xff0c;我们首先观察这个图&#xff0c;发…

算法6:克鲁斯卡尔算法

目录 1. 应用场景-公交站问题2. 克鲁斯卡尔算法介绍3. 克鲁斯卡尔算法图解说明3.1 克鲁斯卡尔算法图解3.2 克鲁斯卡尔算法分析3.3 如何判断是否构成回路 4. 代码实现 1. 应用场景-公交站问题 看一个应用场景和问题&#xff1a; 某城市新增7个站点(A, B, C, D, E, F, G) &#…