并查集和kruskal最小生成树算法
并查集 先定义
int f[10100];//定义祖先
之后初始化
for(int i=1;i<=n;++i)
f[i]=i; //初始化
下面为并查集操作
int find(int x)//int 类型 查找
{
return f[x]==x?f[x]:f[x]=find(f[x]);//三目运算符查找
//如果f[x]==x 返回f[x] 否则返回f[x]=find(f[x]);
}
void unionn(int a,int b)//void 类型 连接
{
a=find(a),b=find(b);//查找两点的祖先,覆盖
f[b]=a;//更改祖先,连接两点
}
kruskal算法就是运用了并查集,但它真正耗时的地方是sort 排序
代码

1 #include<bits/stdc++.h>
2 using namespace std;
3 struct edge
4 {
5 int u,v,w;//u起点 v 终点 w 边权 因为要排序,所以不需要nxt
6 bool operator <(const edge b) const//重载运算符,用于sort(可能更快,不确定),不会,百度搜搜
7 {
8 return w<b.w;//小的在前
9 }
10 };
11 edge e[100010];//建边
12 int f[110];//记录每个点的祖先
13 int n,k,cnt,total,cot;//n 点数 k 关系数 cnt,cot 计数器 total 记录最小生成树的边权和
14 void add(int,int,int);//加边函数声明
15 int find(int);//并查集查找函数声明
16 void unionn(int,int);//并查集合并函数声明
17 int main()
18 {
19 scanf("%d%d",&n,&k);
20 for(int i=1;i<=n;++i) f[i]=i;//初始化
21 for(int u,v,w,i=1;i<=k;++i)
22 {
23 scanf("%d%d%d",&u,&v,&w);
24 add(u,v,w);//加边
25 add(v,u,w);//加边 无向图
26 }
27 sort(e+1,e+cnt+1);//排序 重载运算符排序
28 for(int i=1;i<=cnt;++i)//根据边权从小到大找边判断
29 {
30 int u=e[i].u,v=e[i].v,w=e[i].w;
31 if(find(u)!=find(v))//判断两点是否连接
32 {
33 total+=w;//记录边权和
34 unionn(u,v);//连接,避免后面循环误判
35 cot++;//记录找了几条边
36 }
37 if(cot==n-1) break;//找到n-1条边就退出
38 }
39 printf("%d",total);//输出
40 return 0;//结束
41 }
42 void add(int u,int v,int w)//建边
43 {
44 e[++cnt].u=u;
45 e[cnt].v=v;
46 e[cnt].w=w;
47 }
48 int find(int x)
49 {
50 return f[x]==x?f[x]:f[x]=find(f[x]);//三目运算符查找
51 }
52 void unionn(int a,int b)
53 {
54 a=find(a),b=find(b);
55 if(a!=b) f[b]=a;//加这个判断,有些题会在这里“做文章”
56 }
并查集和kruskal最小生成树算法的更多相关文章
- Kruskal 最小生成树算法
对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- [算法] kruskal最小生成树算法
#include <stdio.h> #include <stdlib.h> #define MAX 100 int N, M; struct Edge { int u,v; ...
- poj1861 network(并查集+kruskal最小生成树
题目地址:http://poj.org/problem?id=1861 题意:输入点数n和边数n,m组边(点a,点b,a到b的权值).要求单条边权值的最大值最小,其他无所谓(所以多解:(.输出单条边最 ...
- 贪心算法(2)-Kruskal最小生成树
什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...
- LeetCode刷题总结-排序、并查集和图篇
本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...
- 最小生成树算法(Prim,Kruskal)
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- 最小生成树之克鲁斯卡尔(Kruskal)算法
学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...
随机推荐
- WPF 制作雷达扫描图
实现一个雷达扫描图. 源代码在TK_King/雷达 (gitee.com),自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割线 绘制扫描范围 添加扫描点 具体实现 首先我们使用自定义的控件. ...
- 2021夏季学期华清大学EE数算OJ2:难缠的店长
2021年夏季学期华清大学电子系数算oj2题解 某知名oier锐评蒟蒻的oj1题解: 话不多说,进入oj2题解: 难缠的oj 之 难缠的店长 当时读完我已经因为无良甲方的行为出离愤怒了!但是做题还是要 ...
- 【多线程】线程休眠 Thread.sleep()
线程休眠 Thread.sleep() sleep (时间) 指定当前线程阻塞的毫秒数: sleep存在异常InterruptedException: sleep时间达到后线程进入就绪状态: slee ...
- monit 命令详解(monit)
monit是Monit软件的主操作控制命令. 语法 monit [options]+ [command] 选项(options) -c file 指定要使用的配置文件 -d n 每间隔多少秒运行一次M ...
- DOM获取元素、修改元素
## DOM获取元素.修改元素### 1.DOM#### ①什么是DOM?作用? > DOM是文档对象模型 > 作用:操作网页内容,可以开发网页内容特效和实现用户交互.#### ②DOM对 ...
- 盘点微信小程序跨页面传值的若干方式
直接给大家上干货 1.跳转页面传递参数 pageA.wxml <button type="primary" bindtap="jumpTo">点击跳 ...
- 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...
- Redis配置登录密码
更新记录 2022年6月14日 发布. 打开配置文件 vi /etc/redis/redis.conf 搜索来找到下面这行注释 #requirepass foobared 取消注释,把 foobare ...
- kafka优劣
kafka优势 可扩展:Kafka集群可以透明的扩展,增加新的服务器进集群. 高性能:Kafka性能远超过传统的ActiveMQ.RabbitMQ等,Kafka支持Batch操作. 容错性:Kafka ...
- VueX的模块你知道多少?
为什么会出现VueX的模块呢?当你的项目中代码变多的时候,很难区分维护.那么这时候Vuex的模块功能就这么体现出来了. 那么我们就开始吧!一.模块是啥? /* eslint-disable no-un ...