并查集 先定义

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最小生成树算法的更多相关文章

  1. Kruskal 最小生成树算法

    对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为 ...

  2. [算法系列之二十七]Kruskal最小生成树算法

    简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...

  3. [算法] kruskal最小生成树算法

    #include <stdio.h> #include <stdlib.h> #define MAX 100 int N, M; struct Edge { int u,v; ...

  4. poj1861 network(并查集+kruskal最小生成树

    题目地址:http://poj.org/problem?id=1861 题意:输入点数n和边数n,m组边(点a,点b,a到b的权值).要求单条边权值的最大值最小,其他无所谓(所以多解:(.输出单条边最 ...

  5. 贪心算法(2)-Kruskal最小生成树

    什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...

  6. LeetCode刷题总结-排序、并查集和图篇

    本文介绍LeetCode上有关排序.并查集和图的算法题,推荐刷题总数为15道.具体考点分析如下图: 一.排序 1.数组问题 题号:164. 最大间距,难度困难 题号:324. 摆动排序 II,难度中等 ...

  7. 最小生成树算法(Prim,Kruskal)

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  8. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  9. 最小生成树之克鲁斯卡尔(Kruskal)算法

    学习最小生成树算法之前我们先来了解下 下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的 ...

随机推荐

  1. uniapp复制到剪贴板

    uni.setClipboardData() ; 例: 给元素添加点击事件 <view @click="doCopy()">复制</view> 复制方法 d ...

  2. 谈谈markdown

    谈谈markdown 欢迎关注我的博客,️点他即可. 最近一年开始学习有关编程的内容了. 迷上代码的我开始接触到一些好玩的东西,我发现很多事情都可以由代码来完成,甚至是ppt.同学就经常说我疯掉了,连 ...

  3. 使用Go实现健壮的内存型缓存

    使用Go实现健壮的内存型缓存 本文介绍了缓存的常见使用场景.选型以及注意点,比较有价值. 译自:Implementing robust in-memory cache with Go 内存型缓存是一种 ...

  4. 从MySQL全备文件中恢复单个库或者单个表

    从MySQL全备文件中恢复单个库或者单个表 提取建库语句 sed -n '/^-- Current Database: db_cms/,/^-- Current Database: `/p' back ...

  5. Spring Boot整合模板引擎freemarker

    jsp本质是servlet,渲染都在服务器,freemarker模板引擎也是在服务器端渲染. 项目结构 引入依赖pom.xml <!-- 引入 freemarker 模板依赖 --> &l ...

  6. Linux详解(基础、环境配置、项目部署入门)

    Linux(CentOS 7)操作系统 消息队列(Kafka.RabbitMQ.RocketMQ),缓存(Redis),搜索引擎(ES),集群分布式(需要购买多台服务器,如果没有服务器我们就只能使用虚 ...

  7. linux挂载新硬盘并进行分区格式化

    最近要给小伙伴们写几篇文章,关于<linux下误删除文件之后该如何恢复>.对于没有进程占用的文件想要进行数据恢复,不同的文件系统格式需要使用不同的工具,比如:ext4.xfs等.我找遍了我 ...

  8. 题解0014:信奥一本通1472——The XOR Largest Pair(字典树)

    题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472 题目描述:在给定的 N 个整数中选出两个进行异或运算,求得到的结果最大是多少. 看到这 ...

  9. Nastran的应变方向

    问题 近日使用Nastran做一个算例,在计算频响时发现:位移场是连续的,而应变场不连续.以某一频率处应变场为例,其上表面X.Y方向应变场分布如下图.此处关闭了云图的插值,所显示的为单元的应变,因此云 ...

  10. c++ 快速乘

    First 在一些数学题中,两个数相乘运算很多,同时又很容易溢出,如两个 long long 相乘 今天本蒟蒻来总结一下快速乘的两种方法 1:二进制 和快速幂的原理一样,优化一个一个加的算法,复杂度\ ...