并查集板子+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) { ...
随机推荐
- 3步安装Python虚拟环境virtualenv
1. pip安装必要库 pip install virtualenv -i https://pypi.douban.com/simple pip install virtualenvwrapper - ...
- (三)Struts2的Action(简单讲解版)
Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架. 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑.但a ...
- 并发编程-线程池&J.U.C
8. 共享模型之工具 8.1 线程池 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率 ...
- 单个java文件打成可执行jar包
1 概述 使用JDK自带的jar与java将单个java文件打成可执行jar包并运行. 当然也可以使用IDE完成,使用Maven只需要一个简单的package,但是单个文件嘛,没必要这么"凶 ...
- JAVAEE_01_什么是javaEE
javaEE Java平台包含三个版本: - JavaME :适用于小型设备和智能卡的JavaME (Java Platform Micro Edition,Java微型版) - JavaSE : 适 ...
- Word 查找和替换字符串方法
因为项目需要通过word模板替换字符串 ,来让用户下载word, 就在网上找了找word查找替换字符串的库或方法,基本上不是收费,就是无实现,或者方法局限性太大 .docx 是通过xml来存储文字和其 ...
- mooc人大单元测试3
@font-face { font-family: Wingdings } @font-face { font-family: 宋体 } @font-face { font-family: " ...
- Scrum Meeting 目录 && alpha 第一次Scrum Meeting博客
是兄弟就来摸鱼小组 Scrum Meeting 博客汇总 一.Alpha阶段 标号 标题 1 [alpha]第一次Scrum Meeting(见本文) 二.Beta阶段 会议安排 时间 4月23日8时 ...
- 1030 Travel Plan
A traveler's map gives the distances between cities along the highways, together with the cost of ea ...
- 《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
一.利用回归树实现分类 分类也可以用回归树来做,简单说来就是训练与类别数相同的几组回归树,每一组代表一个类别,然后对所有组的输出进行softmax操作将其转换为概率分布,然后再通过交叉熵或者KL一类的 ...