当前位置: 首页 > news >正文

图论之cruskal算法(克鲁斯卡尔)

我们已经学了prim算法了,接下来我们来学一下cruskal算法,和prim算法不同的点就在于prim是不断的加结点,而cruskal是不断的加边,不断的加最小的边,我们需要把每个边的权值用结构体存起来,然后排序,从小到大遍历边,不断的加边

如图,我们从权值最小的边开始

当我们把1,2权值为2的边加上去的话,就不符合我们要找生成树的性质了,

那我们怎么维护生成树呢?我们可以把形成生成树的这些结点都放在一个集合里,然后接下来看插入的边的两个结点是不是位于生成树集合里,如果位于生成树集合的话就不连了

OK,那么废话不多说,我们来实现一下代码吧

#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
const int N = 2e5 + 10, INF = 0x3f3f3f3f;
struct node {
	int x;//结点1
	int y;//结点2
	int z;//权值 
}a[N];
int fa[N];
int find(int x)
{
	if (fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}
void un(int x, int y)
{
	int px = find(x); int py = find(y);
	fa[px] = py;
}
bool cmp(const node& x, const node& y)
{
	return x.z < y.z;
}
int ret = 0;
int cnt = 0;//记录加入了几条边 
int kk()
{
	sort(a + 1, a + 1 + m, cmp);
	for (int i = 1; i <= m; i++)
	{
		int x1 = a[i].x, y1 = a[i].y;
		int z1 = a[i].z;
		int fx = find(x1), fy = find(y1);
		if (fx != fy)
		{
			ret += z1;
			cnt++;
			un(fx, fy);
		}

	}
	return cnt == n - 1 ? ret : INF;
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		fa[i] = i;
	}
	for (int i = 1; i <= m; i++)
	{
		cin >> a[i].x >> a[i].y >> a[i].z;
	}
	int r = kk();
	if (r == INF) cout << "orz" << endl;
	else cout << r << endl;




	return 0;
}

相关文章:

  • CT重建笔记(四)——三维重建
  • Function 和 Consumer函数式接口
  • HTML 新手入门:从零基础到搭建第一个静态页面(二)
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三)
  • 向量数据库技术系列五-Weaviate介绍
  • 《TypeScript 快速上手:类型、编译与严格模式的简明教程》
  • 数统院复试来啦,西电数学与统计学院—考研录取情况
  • 如何查看windows系统的硬件环境(附方法
  • Scheme语言的压力测试
  • 中考英语之04高频词汇变形
  • 82.HarmonyOS NEXT 性能优化指南:从理论到实践
  • 西咸新区 能金区调研
  • 【大模型基础_毛玉仁】2.5 基于 Decoder-only 架构的大语言模型 -- GPT和LLaMa模型介绍
  • AF3 Rigid3Array类介绍
  • 【时时三省】(C语言基础)用printf函数输出数据3
  • 【Go每日一练】猜数字游戏
  • DVWA 命令注入从 Low 到 Impossible 教程及源码分析
  • 基于小参数量大语言模型(Small Language Models) ---- 在制造业落地降本增效应用:可行性研究初探
  • Spring Boot项目中成功集成了JWT
  • 250316-Open-WebUI源码部署+离线迁移
  • 专门做正品的网站/站长统计ios
  • 烟台网站建设yt/武汉网站开发公司
  • 腾讯云如何做网站/百度广告联盟点击一次多少钱
  • 体育网站建设的分析/河南郑州最近的热搜事件
  • 合肥网站建设兼职/优化公司哪家好
  • 一家公司可以做几个网站/百度热搜电视剧