并查集板子+kruskal
最近在学最小生成树得时候又用到了并查集,一起来整理一下
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的更多相关文章
- hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10
搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1 ...
- HDU 1232 并查集板子题
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- 最小生成数(并查集)Kruskal算法
并查集:使用并查集可以把每个连通分量看作一个集合,该集合包含连通分量的所有点.这两两连通而具体的连通方式无关紧要,就好比集合中的元素没有先后顺序之分,只有属于和不属于的区别.#define N 100 ...
- hdu1213 并查集板子
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1213/ 并查集是一种支持合并与查找的数据结构,在森林中进行操作,加上路径压缩,合并和查找的时间复杂度几乎都是常数 ...
- hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- hdu 1863 畅通工程 (并查集 、 kruskal)
畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- BZOJ 3624 并查集 (Kruskal)
思路: 先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路 再重新做一遍最小生成树 加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k 最后加上水泥路就好了 //By SiriusRen #in ...
- Zjnu Stadium HDU - 3047 带权并查集板子题
#include<iostream> #include<cstring> #include<cstdio> using namespace std; +; int ...
- 畅通工程 HDU - 1232 并查集板子题
#include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...
随机推荐
- P1090 合并果子(JAVA语言)
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...
- c++ 反汇编 局部静态变量
vs2017下测试 34: for (int i = 0; i < 5; i++) 0029734E C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0 0 ...
- MyBatis详细执行流程
mybatis详细执行流程 一.通过Resource去加载全局配置文件 import org.apache.ibatis.io.Resources; import org.apache.ibatis. ...
- Spark中普通集合与RDD算子的sortBy()有什么区别
分别观察一下集合与算子的sortBy()的参数列表 普通集合的sortBy() RDD算子的sortBy() 结论:普通集合的sortBy就没有false参数,也就是说只能默认的升序排. 如果需要对普 ...
- vue实现日历
vue实现日历 之前在上家公司做过一个公司人员考勤的东西,里面需要用到日历,当时自己用vue随便写了一个,比较简单 下面代码是删掉了其他功能的代码,只留下日历部分 <template> & ...
- 再学dockerfile
前言 docker的系统学习可以看我这篇博文:https://www.cnblogs.com/zisefeizhu/p/11298818.html 有非常详细的讲解 容器现在都是用kubernetes ...
- seq 命令用法
以指定增量从首数开始打印数字到尾数. 用法: seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 选项: -f, --format=格式 ...
- 一文带大家彻底搞懂Hystrix!
前言? Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种实现,用 ...
- ognl表达式应用场景和用法
ognl表达式的用法和应用场景 1.配置文件 //书写方式是:'${@类全限定名@常量}' dic_city.type=${@com.imooc.constant.DictionaryConstant ...
- 软工案例分析作业-CSDN
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 提升软件开发能力与团队意识 这个作业在哪个具体方面帮助我实 ...