c++ 写并查集算法模板

并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。
给出一个有向图,经过并查集算法可以很快地判断任意连个点是否属于同一个集合。

#include
#include
#include
#define MAXN 1000
using namespace std;
int root[MAXN]; //the root of a node
int	layer[MAXN];	
int n, m;	//the number of node and edge
void init(){
	for (int i = 0; i < n; i++){
		root[i] = i;
		layer[i] = 0;
	}
}
//find the finaly root and updata the journey
int find_root(int a){
	if (root[a] == a ) return a;
	return root[a] = find_root(root[a]);
}

//connect tow node
void unite(int a, int b){	
	int aroot = find_root(a);
	int broot = find_root(b);
	if (aroot == broot) return;
	// node with smaller ranke connect to the another root
	if (layer[aroot] < layer[broot])	root[aroot] = broot;
	else root[broot] = aroot;
	//only if tow node equal to rank then change layer
	if (layer[aroot] ==  layer[broot]) layer[aroot]++;
}

int main(){
	cin >> n >> m;
	init();
	while (m--){
		int a, b;
		cin >> a >> b;
		unite(a, b);
	}
	//show the result
	for (int i = 0; i < n; i++){
		printf("%d ---> %d \n", i, root[i]);
		//if root[i] is same then those node come from a same set
	}
	return 0;
}

/*
example input:
8 6
0 1
3 1
1 4
5 2
6 2
7 6 
*/

你可能感兴趣的:(数据结构与算法,c++,并查集算法,模板,代码)