并查集模板
来源:互联网 发布:天通金交易软件下载 编辑:程序博客网 时间:2024/05/04 21:25
#include <iostream>using namespace std;#define N 100005struct set{int parent; //记录父节点int rank; //记录集合的节点数} elem[N];int MAX;void init(){int i;for (i = 0; i <= N; i++){elem[i].parent = i;elem[i].rank = 1;}}int Find(int x){int root, temp;temp = x;while (x != elem[x].parent) //寻找根节点{x = elem[x].parent;}root = x;x = temp;while (x != elem[x].parent) //压缩路径,全部赋值为根节点的值{temp = elem[x].parent;elem[x].parent = root;x = temp;}return root;}void Union(int a, int b) //合并两个集合{int x, y;x = Find(a);y = Find(b);if (elem[x].rank >= elem[y].rank){elem[y].parent = elem[x].parent;elem[x].rank += elem[y].rank;if (MAX < elem[x].rank){MAX = elem[x].rank;}}else{elem[x].parent = elem[y].parent;elem[y].rank += elem[x].rank;if (MAX < elem[y].rank){MAX = elem[y].rank;}}}int main(){int n; //有关系的对数int a, b, x, y;while (scanf("%d", &n) != EOF){init();MAX = -1;while (n--){scanf("%d%d", &a, &b);x = Find(a);y = Find(b);if (x != y){Union(a, b); //a和b不是一个集合的,合并这两个集合}}if (MAX != -1){printf("%d/n", MAX); //输出最大集合的节点数}else{printf("1/n"); //此时n=0,证明都是没关系的人}}return 0;}
0 0
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 【模板】并查集
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集【模板】
- 并查集 模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集模板
- 并查集 模板
- 并查集模板
- u-boot-2014.10移植第19天----添加nand flash命令支持(一)
- CFile 打开文件 相对路径和绝对路径
- JAVA内存泄漏调试
- LA-2523 & POJ-1325 & HDOJ-1150 Machine Schedule 解题报告
- Java编程思想学习笔记
- 并查集模板
- Android——按钮的事件监听
- 第11周项目1.3输出字模点阵(补)
- SELinux简单学习
- DLX(n皇后)spoj1771
- STM32最小系统
- leetcode Generate Parentheses
- Mapreduce 导出HBase table 数据到HDFS路径
- Uva 10118 Free Candies (DP+记忆化搜索)