#define _for(i,a,b) for(int i = (a);i < (b);i ++)
const int maxn = 50003;
int par[maxn]; //父亲
int high[maxn]; //树的高度void init(int n)
{_for(i,0,n){par[i] = i;high[i] = 0;}
} int find(int x)
{return par[x] == x ? x : par[x] = find(par[x]);
}void unite(int x,int y)
{x = find(x);y = find(y);if(x==y) return ;if(high[x]<high[y])par[x] = y;else{par[y] = x;if(high[x]==high[y])high[x] ++;}
}bool same(int x,int y)
{return find(x) == find(y);
}

路径压缩普通并查集

#define _for(i,a,b) for(int i = (a);i < (b);i ++)
const int maxn = 50003;
int par[maxn]; //父亲 void init(int n)
{_for(i,0,n)par[i] = i;
} int find(int x)
{return par[x] == x ? x : find(par[x]);
}void unite(int x,int y)
{x = find(x);y = find(y);if(x==y) return ;   par[x] = y;
}bool same(int x,int y)
{return find(x) == find(y);
}

朴实无华的并查集

#include <bits/stdc++.h>
using namespace std;#define _for(i,a,b) for(int i = (a);i < (b);i ++)
const int maxn = 50003;
int par[maxn]; //父亲
int high[maxn]; //树的高度
int id[maxn]; //映射,里面装的是现在真正的序号
int idEnd;
void init(int n)
{idEnd = n;_for(i,0,n){par[i] = id[i] = i;high[i] = 0;}
} int find(int x)
{return par[x] == x ? x : par[x] = find(par[x]);
}void unite(int x,int y)
{x = find(x);y = find(y);if(x==y) return ;if(high[x]<high[y])par[x] = y;else{par[y] = x;if(high[x]==high[y])high[x] ++;}
}void del(int x)
{id[x] = idEnd ++;high[id[x]] = 0;par[id[x]] = id[x];
}bool same(int x,int y)
{return find(x) == find(y);
}int main()
{init(7);unite(id[1],id[4]);unite(id[2],id[4]);unite(id[3],id[4]);unite(id[4],id[5]);unite(id[6],id[5]);cout << same(id[4],id[5]) << endl;del(id[4]);cout << same(id[4],id[5]) << endl;cout << same(id[1],id[5]) << endl;cout << same(id[6],id[2]) << endl;return 0;
}

带删除的路径压缩并查集

map<string,int> IDcache;
vector<string> Stringcache;int ID(string s)
{if(IDcache.count(s)) return IDcache[s];Stringcache.push_back(s);return IDcache[s] = Stringcache.size()-1;
}

集合映射以方便并查

种类并查集:POJ-1182,解题策略是并查集的每个集合内的元素都同真或同假,所以每个动物就有3种可能的状态,在A或在B或在C。当第i个动物属于集合A这一命题和第j个动物属于集合B这一命题在并查集的同一集合内时,若此时出现新命题,为第i个动物和第j个动物是在同一集合内,只需要看i属于A这一状态是否和j属于B或者j属于C在并查集同一集合内,如果在同一集合内,说明两命题同真或同假,那么很显然新命题就是错误的,这样就能判定新命题的真假。

主要思想是由于动物种类的不确定,所以只能以命题的形式将多个命题通过并查集连接起来,以判断命题的真假。

带权并查集:主要思想是将一个并查集内的每个集合中的每个元素赋予一个权值,这个权值的意义可以是多样的,比如他与根节点的关系,或者不使用路径压缩时以他为根的权值之和。要多用一个数组,其大小就是总元素个数,来表示各种权值。

转载于:https://www.cnblogs.com/Asurudo/p/10454766.html

ACM模板——并查集相关推荐

  1. 并查集模板——并查集(洛谷 P3367)

    题目选自洛谷P3367 是并查集的最入门的题目,也是并查集的模板题~~ 如果你还不知道并查集是什么? 请看我的这篇文章 点击链接 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 ...

  2. 【畅通工程 HDU - 1232 】【并查集模板题】

    并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...

  3. 战争来临(并查集模板题)

    战争来临(并查集模板题) 描述   那一个骑单车卖报纸的少年 恐慌的眼泪慢慢布满了侧脸----<战争世界>   B国对A国发动了侵略战争,A国不得不全力抵御.A国幅员辽阔,后方群众的支援补 ...

  4. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  5. ACM入门之【并查集】

    并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题. 它支持两种操作: 查找:确定某个元素处于哪个子集. 合并:将两个子集合并成一个集合. 基本模板: const in ...

  6. 【模板】并查集 两种路径压缩写法(类模板和函数模板)

    并查集函数模板写法: #include <bits/stdc++.h> using namespace std; typedef long long ll; #define MAX_N 1 ...

  7. 7-36 并查集【模板】 (10 分)

    7-36 并查集[模板] (10 分) 给出一个并查集,请完成合并和查询操作. 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi​.Xi​.Yi​. ...

  8. 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序

    problem L3-003 社交集群 (30分) 当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友.一个"社交集群"是指部分兴趣 ...

  9. 【LibreOJ109】【模板】并查集

    并查集模板,就酱紫. #include<iostream> using namespace std; #define mod 998244353long long ans;int fa[4 ...

最新文章

  1. Mybatis Plugin插件安装破解及使用
  2. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化
  3. 《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程
  4. 男孩子也是要护肤的!!!
  5. ubuntu 16.4 安装postgreSQL,使C++链接到数据库
  6. sql 账号查询一个表勾选那个权限_Spring Cloud微服务架构中的数据权限DataPermision实现方案...
  7. MUI 拍照和从系统相册选择图片上传
  8. python比赛评分计算_python3:(可输入评委人数和参赛人数)模拟决赛现场最终成绩计算过程...
  9. python基础试题选择题_附带答案的15道经典python基础面试题
  10. 预印本(Preprint)及出版商的投稿政策
  11. dpdk大页内存实现
  12. 浅谈SpringAOP功能源码执行逻辑
  13. android 打地鼠,Android实现打地鼠小游戏
  14. 坚果pro2刷原生android,坚果Pro2普通版(U3 Pro)魔趣OS 安卓10 纯净完美 原生极简 纯净推荐...
  15. python学习(2)
  16. Java调用IE浏览器
  17. 如何用Python进行数据分析
  18. c 语言友元函数重载,C++友元函数重载++和--运算符
  19. android midi字节,MIDI的20个基本概念
  20. wine linux 64位下载,Wine 1.9 开发者版本可以下载了

热门文章

  1. Unity4.6新UI系统初探(uGUI)
  2. excel随机数的获取
  3. BP神经网络基本原理
  4. Graph Search图谱搜索
  5. jedis ShardedJedisPool的 HASH一致性算法(一)从String 的hashcode说起
  6. 桌面虚拟化对企业IT的四大贡献
  7. heartbeat原理介绍
  8. PPP、MP 和 SLIP 配置(上)
  9. Terminal Services将改名为RDS
  10. 转贴一篇关于NAT(DNAT)以及PAT的讨论