并查集简单模板

并查集解决的问题很典型,就是等价类划分的问题。

三个函数:

void init(int *p, int n)
{
	for(int i=0; i
	else if(h1==h2) // 同属一个等价类,则返回
	{
		return;
	}
else{pn[h1] = h2;pn[h2]--;}}

给定n个元素,m个等价关系,要你去划分出等价类,求等价类的个数,和每个等价类包含多少个元素。

【示例1】

// 并查集示例:合并等价类,最后可以计算:
// 1.共有几个等价类;
// 2.每个等价类包含多少个元素;
// 3.给定两个元素,是否属于同一等价类
// 示例输入:
//12 8
//0 2
//2 4
//1 7
//3 5
//4 8
//10 11
//0 6
//1 5

#include 
#include 
using namespace std;

void init(int *p, int n)
{
	for(int i=0; i
	else if(h1==h2) // 同属一个等价类,则返回
	{
		return;
	}
else{pn[h1] = h2;pn[h2]--;}}int main(){int n;cin>>n; // 元素个数int *pn = new int [n];//int m;cin>>m; // 关系个数int i;init(pn, n); // 初始化为-1for( i=0; i>x>>y;Union(x,y,pn); // 合并}// 输出int count = 0;for(i=0; i

输出:
第 1 个集合 - 元素个数 5
第 2 个集合 - 元素个数 3
第 3 个集合 - 元素个数 1
第 4 个集合 - 元素个数 2
共计: 4 个集合


【示例2】

并查集简单模板_第1张图片


如图,拥有3个8连块,size分别是1,3,7.这个问题可以用搜索来做,也可以用并查集来做。

并查集空间O(n),时间O(n)。n为矩阵元素个数。代码:

#include 
#include 
using namespace std;

void init(int *p, int n)
{
	for(int i=0; i>m>>n; // m*n
	int *parent = new int [m*n];
	//
	int *sq = new int[m*n];  // 存放矩阵本身
	int i,j;
	init(parent, m*n); // 初始化为-1
	for( i=0; i>ch;  //scanf("%c ", &ch); // 要用cin,用scanf会出错
			sq[i*n + j] = ch - '0';
		}
	}

	// 打印矩阵
	for( i=0; i=0  && sq[i*n + j] == 1 &&  sq[(i+1)*n + j -1] ==1) 
				Union(i*n+j, (i+1)*n+j-1, parent);
		}
	}

	// 输出
	int count = 0;
	for(i=0; i

输出:

1 0 0 1 0 0 
0 0 1 0 1 0 
0 0 0 0 0 0 
1 1 0 0 0 0 
1 1 1 0 0 0 
0 1 0 1 0 0 
第 1 个黑格子集合 - 元素个数 1 - ta的根位于第 0 个元素
第 2 个黑格子集合 - 元素个数 3 - ta的根位于第 3 个元素
第 3 个黑格子集合 - 元素个数 7 - ta的根位于第 18 个元素
共计: 3 个集合




你可能感兴趣的:(算法)