首页 > 编程语言 >克鲁斯卡尔算法

克鲁斯卡尔算法

时间:2024-08-01 16:40:14浏览次数:12  
标签:连通 int 查集 克鲁斯 算法 卡尔 find

克鲁斯卡尔算法

稀疏图-->用克鲁斯卡尔算法

克鲁斯卡尔算法套路:

首先存放每条边用struct

然后按照权值从小到大排序

然后如果这条边的两个端点已经在一个连通块就不要把这条边放进来(因为生成树不能有闭合回路)如已经有边12,边13不能再放入边23

判断连通块用find函数

利用并查集算法判断连通块

 

并查集:

点1,2如果有共同祖先那么在同一个连通块find(x)=find(y)

find找祖宗函数

P[x]存放祖宗

P[x]=x就是P[x]存放的就是x下标那么p[x]就是祖宗就可以返回否则递归找父亲的父亲P[x]=find(P[x])

 

int find(int x){//并查集找祖宗 if(P[x]!=x){//不是祖宗 就找父亲的父亲 P[x] =find(P[x]);//递归   }

 

[//]: # (打卡模板,上面预览按钮可以展示预览效果 ^^)
考点:结构体,结构体比较,并查集找祖宗
```
//这里填你的代码^^
#include<bits/stdc++.h> 
using namespace std;
const int N=200006;
struct p{//存放边,端点是a,b
	int a;
	int b;
	int w;//权值
}e[N];
bool com(p x,p y){//结构体排序,比较函数
	return x.w<y.w;
}
int n,m;//n个顶点,m条边 
int P[N];//存放祖宗 
int find(int x){//并查集找祖宗
if(P[x]!=x){//不是祖宗 就找父亲的父亲
P[x] =find(P[x]);//递归

}
return 	P[x];
}
int main(){
	cin>>n>>m;
	int u,v,W;
for(int i=0;i<m;i++){
	cin>>u>>v>>W;
	e[i]={u,v,W};
}
sort(e,e+m,com);//从小到大排序边长
int cnt=0;//连通的边数
int res=0;//最小生成树权值和
//利用并查集判断连通块
for(int i=1;i<=n;i++) {
	P[i]=i;//祖先先定为点的下标  ** **** ** 
}
for(int i=0;i<m;i++){
	int x=e[i].a;
	int y=e[i].b;
	int z=e[i].w;
	if(find(x)!=find(y)){//祖宗不同
	P[find(x)] =find(y);
	res+=z;
	cnt++;
		
	}
 
}


if(cnt<n-1) cout<<"impossible";
else{
	cout<<res;
}
 

return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
```

 

标签:连通,int,查集,克鲁斯,算法,卡尔,find
From: https://www.cnblogs.com/luckyhappyyaoyao/p/18336958

相关文章

  • 刀具磨损预测工器具磨损预测-RIME-CNN-SVM霜冰算法优化-完整代码数据
    直接看项目演示:刀具磨损预测工器具磨损预测-RIME-CNN-SVM霜冰算法优化_哔哩哔哩_bilibili效果演示:代码: importnumpyasnpimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptimfromtorch.utils.dataimportDataLoad......
  • 代码随想录算法训练营第56天 | 广搜和深搜应用
    110.字符串接龙https://kamacoder.com/problempage.php?pid=1183代码随想录https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路105.有向图的完全可达性https://kamacoder.com/problempage.php?pid=1177代码随想录https://www.programmercarl.com/kamaco......
  • Day 30 贪心算法 Part04
    452.用最少数量的箭引爆气球自己写没写出来,不过找到篇很好的题解,贪心想不到就是想不到,没办法。本以为自己的思路也是贪心,但就是做不出来。classSolution{publicintfindMinArrowShots(int[][]points){boolean[]visited=newboolean[points.length];......
  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 基于模仿学习的自动泊车运动规划算法
    基于模仿学习的自动泊车运动规划算法本文使用ResNet+BERT分类模型来实现APA自动泊车算法附赠自动驾驶最全的学习资料和量产经验:链接首先定义模型的输出动作类别类别名说明S0停车S+直行前进单位距离S-直行后退单位距离L+左转前进单位角度L-左转后退单位角度R+右转前进......
  • 排序算法总结
    排序算法是数据结构与算法中的一个重要部分,用于对一组数据按照特定顺序进行排列。常见的排序算法有很多,每种算法都有其独特的时间复杂度、空间复杂度和稳定性等特性。以下是一些常用的排序算法及其特点:冒泡排序(BubbleSort):时间复杂度:平均情况下为 O(n2)O(n2),最坏情况下也是......
  • 【基础算法】前缀和和差分
    前缀和和差分前缀和一维前缀和二维前缀和差分一维差分二维差分前缀和前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。一维前缀和前缀和算法有什么好处呢?先了......
  • 常见的排序算法(Java实现)
      一、冒泡排序      相邻的两个元素比较,大的放右边,小的放左边。二、选择排序   从0索引开始,把每一个索引依次跟后面的索引比较,大的放后面,小的放前面三、插入排序  将数组分为有序和无须两种,遍历数组将无须的数组插入有序的数组当中四、快......
  • springboot+vue基于协同算法的电影推荐系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,网络视频平台已成为人们日常生活中不可或缺的一部分,尤其是电影观看的主要渠道。然而,面对海量的电影资源,用户往往难以快速找到符合自己喜好的影片,这不仅降低了用户体验,也限制了电影内容的有效传播。传统的推荐系统......
  • springboot+vue基于协同过滤算法的新闻推荐系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景在信息爆炸的时代,互联网上的新闻资讯以惊人的速度增长,用户在面对海量新闻时往往感到无所适从,难以快速筛选出符合个人兴趣与需求的内容。传统的新闻浏览方式已难以满足用户个性化、高效化的信息获取需求。因此,开发一种能够智能推荐个性......