【模板】并查集 两种路径压缩写法(类模板和函数模板)
并查集函数模板写法:
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MAX_N 1000int par[MAX_N]; //par[i]表示i节点的父节点 int rank[MAX_N]; // 树的高度 //初始化n个元素 void init(int n){for(int i = 0;i < n; i++){par[i] = i;rank[i] = 0;} } //查询包含x节点的树的根 int find(int x){if(par[x] == x) return x;else return par[x] = find(par[x]); }//合并 x和y所属的集合 void unite(int x,int y){x = find(x);y = find(y);if(x == y) return;if(rank[x] < rank[y]){par[x] = y; }else{par[y] = x;if(rank[x] == rank[y]) rank[x]++;} }//判断x和y是否属于同一个集合 bool same(int x,int y){return find(x) == find(y); }int main(){return 0; }
并查集类模板写法:
class UnionFind{ private:int* parent;int* rank;int count; public:UnionFind(int count){parent = new int[count];rank = new int[count];this->count = count;for(int i = 0;i < count; i++){parent[i] = i;rank[i] = 1;}}~UnionFind(){delete[] parent;delete[] rank;}int find(int p){assert(p >= 0&&p < count);/* while(parent[p] != p){parent[p] = parent[parent[p]];p = parent[p];}*/ // 实践更好if(p != parent[p]) //理论更好parent[p] = find(parent[p]);return parent[p];}bool isConnected(int p,int q){return find(p) == find(q);}void unionElements(int p,int q){int pRoot = find(p);int qRoot = find(q);if(pRoot == qRoot)return;if(rank[pRoot] < rank[qRoot]){parent[pRoot] = qRoot;}else if(rank[pRoot] > rank[qRoot]){parent[qRoot] = pRoot;}else{parent[pRoot] = qRoot;rank[qRoot]++ ;}} };
转载于:https://www.cnblogs.com/zhangjiuding/p/7710721.html
【模板】并查集 两种路径压缩写法(类模板和函数模板)相关推荐
- java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...
java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...
- 并查集 rank排序+路径压缩
有两个优化点: rank排序 记录两个合并的根的rank rank低的合并到rank高的上 这个优化目的是避免树的深度增加 路径压缩 parent[p] = parent[parent[p]] 这行代 ...
- Python中的两种路径
Java中有两种路径,一种是操作系统的路径path,另一种是类路径classpath. Python中也是如此,一种是操作系统环境变量中的path,另一种是PYTHONPATH. 当import xx ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...
- ACM模板——并查集
#define _for(i,a,b) for(int i = (a);i < (b);i ++) const int maxn = 50003; int par[maxn]; //父亲 int ...
- POJ1417 True Liars ——种类并查集+01背包+路径** 好题
POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...
- hdu1181变形课dfs/bfs/并查集三种解法(java)
题目链接 Problem Description 呃-变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个 ...
- iOS:图片上传时两种图片压缩方式的比较
上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...
- 并查集模板——并查集(洛谷 P3367)
题目选自洛谷P3367 是并查集的最入门的题目,也是并查集的模板题~~ 如果你还不知道并查集是什么? 请看我的这篇文章 点击链接 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 ...
最新文章
- 【Python】Pandas数据挖掘与分析时的常用方法
- VTK:PolyData之FitSplineToCutterOutput
- stl中Priority Queues(优先队列)的基本用法
- 华为宣布今年将投入2亿美元推动鲲鹏计算产业发展
- 使用 JS刷新框架子页面
- php遗漏,PHP被遗漏的执行函数
- 计算机软件知识pdf,[计算机软件及应用]PDF基础知识.doc
- 手机端html本地存储,HTML5 web storage本地存储
- Angr安装与使用之使用篇(二)
- 三星手机服务器无影响,终于找到手机网速慢的原因了!原来有这么多讲究
- 查看变量内存的python内置函数是_这68个Python内置函数,建议你吃透
- 【TensorFlow】DNNRegressor 的简单使用
- Git 工具(写的很乱)
- 自定义注解,实现jpa查询,使用起来很方便,记录一下
- c++语言解一元二次方程,C++ 求解一元二次方程
- Nature neuroscience:神经脆弱性作为癫痫发作区脑电图标志物
- C语言 文件合成器代码(用图片掩盖.rar文件)
- 如何在SQL中实现排序间接
- webpack4.x的学习
- 阿里巴巴收购网易考拉,定了!