最近在学最小生成树得时候又用到了并查集,一起来整理一下

1.并查集

并查集就是字面意思,将两个单独得集合合并成一个大的集合。

并查集关键在于两个操作:合并和查找

先要完成查找操作(合并操作在查找的基础上)

int find(int x)
{
return root[x] == x ? x : root[x]=find(root[x]);
}

查找x个体所在的根结点,从而确定集合关系 ,find函数缩短路径 ,把一个集合中所有元素都指向一个根结点,减少树的高度 ,如果x的根结点root[x]为自己则返回x,如果不是x的根结点root[x]=root[x]的根节点递归找到那个共同的根。

最后就是合并操作

void add(int x,int y)
{
int n=find(x);
int m=find(y);
if(n!=m) root[n]=m;
}

合并操作先检查两者是否已经在同一集合,如果不在同一集合(不为相同的根节点)则把两元素的根结点相连达到合并目的,两集合合并成同一集合。

2.kruskal板子 最小生成树

kruskal是把图的边视为集合中的元素,用贪心思想,把边的权值从小到大遍历,找到n-1条边连接n个节点,最重要的是 防止集合中的边形成环导致不为最小生成树

来自洛谷 :P3366最小生成树板子

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <cmath>
#include <set>
#include <queue>
#define ri int typedef int ll;
typedef long long lll;
using namespace std; const long long mod=1e9+7; ll n,m;
ll p[200005]; //root数组
struct e{
ll f;
ll e;
ll w; //权值
}a[200005]; //边集合 bool cmp(e a,e b)
{
return a.w<b.w;
} ll find(ll x) //查
{
return p[x] == x ? x : p[x]=find(p[x]);
} int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin >> n >> m;
for(ri i=1;i<=m;++i)
cin >> a[i].f >> a[i].e >> a[i].w;
for(ri i=1;i<=n;++i) p[i]=i;
sort(a+1,a+1+m,cmp); //按照权值排序从小到大 ll l,r;
ll ans=0;
for(ri i=1;i<=m;++i)
{
l=find(a[i].f);
r=find(a[i].e);
if(l!=r) //合并
{
ans+=a[i].w;
p[l]=r;
}
}
cout << ans << '\n';
return 0;
}

并查集板子+kruskal的更多相关文章

  1. hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10

    搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1 ...

  2. HDU 1232 并查集板子题

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  3. 最小生成数(并查集)Kruskal算法

    并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 ...

  4. hdu1213 并查集板子

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...

  5. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  6. hdu 1863 畅通工程 (并查集 、 kruskal)

    畅通工程Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. BZOJ 3624 并查集 (Kruskal)

    思路: 先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路 再重新做一遍最小生成树 加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k 最后加上水泥路就好了 //By SiriusRen #in ...

  8. Zjnu Stadium HDU - 3047 带权并查集板子题

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; +; int ...

  9. 畅通工程 HDU - 1232 并查集板子题

    #include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...

随机推荐

  1. c++ 反汇编 循环结构

    debug do···while 23: int nSum = 0; 00A572AE C7 45 F8 00 00 00 00 mov dword ptr [nSum],0 24: int nInd ...

  2. 「HTML+CSS」--自定义按钮样式【002】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  3. JAVA题目:小芳的妈妈每天给她2.5元,她都会存起来,但是,每当这一天是存钱的第五题或者5的倍数的话,她都会去用掉6块钱。 问:至少经过多少天可以存到100块?

    1 /*题目:小芳的妈妈每天给她2.5元,她都会存起来, 2 但是,每当这一天是存钱的第五题或者5的倍数的话, 3 她都会去用掉6块钱. 4 问:至少经过多少天可以存到100块? 5 */ 6 /*分 ...

  4. 使用 Elastic 技术栈构建 Kubernetes全栈监控

    以下我们描述如何使用 Elastic 技术栈来为 Kubernetes 构建监控环境.可观测性的目标是为生产环境提供运维工具来检测服务不可用的情况(比如服务宕机.错误或者响应变慢等),并且保留一些可以 ...

  5. vuejs集成echarts的一些问题

    最近在做Beetlex的数据分析平台,在开发这个产品过程中涉及到大量的数据图表展示功能:由于产品前端使用的是vuejs开发,所以在集成echarts或多或少会碰到一些问题,在这里主要讲解一下碰到的问题 ...

  6. Mokito 单元测试与 Spring-Boot 集成测试

    Mokito 单元测试与 Spring-Boot 集成测试 版本说明 Java:1.8 JUnit:5.x Mokito:3.x H2:1.4.200 spring-boot-starter-test ...

  7. hahahah JavaScript 小小小细节

    nice~!

  8. CountDownLatch与CyclicBarrier的基本使用

    1 概述 CountDownLatch以及CyclicBarrier都是Java里面的同步工具之一,本文介绍了两者的基本原理以及基本使用方法. 2 CountDownLatch CountDownLa ...

  9. Linux终端更改字体

    1 概述 这里的终端是指通过F1-F6/F2-F7进入的纯命令终端. 修改字体可以通过setfont命令. 2 查看字体 可以通过查找目录consolefonts来确定本地机器上的字体位于哪里: fi ...

  10. 6. linux 专业词汇

    什么是交换分区? 交换分区是一个特殊的分区,他的作用相当于windows下的虚拟内存,这个分区的大小一般设置为物理内存的两倍. 什么是Grub? Grub是一个系统引导工具,通过它可以加载内核,从而引 ...