并查集
来源:互联网 发布:ios wkwebview 传值js 编辑:程序博客网 时间:2024/04/30 13:03
[简介]
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。在数据量过大时,只能用并查集来描述。并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集的相关介绍参见并查集详解。
其核心函数如下:
#define MAX 100000int pre[MAX]; //记录当前节点的父节点int find(int x){ //查找跟节点 if(x != pre[x]) pre[x] = find(pre[x]); //压缩路径 return pre[x];}void combine(int x, int y){ //合并集合 int a = find(x); int b = find(y); if(a != b) pre[a] = b;}
hdu-1232题目并查集实现如下:
#include <iostream>#include <stdio.h>using namespace std;#define MAX 5000000int pre[MAX];void init(int N){ for(int i=1; i<=N; i++) pre[i] = i;}int find(int x){ if(x != pre[x]) pre[x] = find(pre[x]); return pre[x];}void combine(int x, int y){ int a = find(x); int b = find(y); if(a != b) pre[a] = b;}int main(){ int N,M,a,b; freopen("in.txt","r",stdin); while(scanf("%d%d",&N,&M) && N!=0){ int num=-1; init(N); for(int i=0; i<M; i++){ scanf("%d%d",&a,&b); combine(a,b); } for(int i=1; i<=N; i++){ if(pre[i] == i) num++; } cout<<num<<endl; } return 0;}
0 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- Android ViewDragHelper完全解析 自定义ViewGroup神器
- STM32F4 按键FIFO设计
- USACO Prime Palindromes(dfs)
- MySql基本查询、连接查询、子查询、正则表达查询讲解
- 递归调用
- 并查集
- 微信开发几个坑
- C#基础加强第二天总结--面向对象2及字符串
- pat 1092. To Buy or Not to Buy (20)
- 解决Eclipse中C++代码显示Symbol 'std' could not be resolved的问题
- 数据适配器BaseAdapter
- 线程与进程(上)
- Merge k Sorted Lists
- LeetCode Product of Array Except Self