並查集



//並查集
#include <iostream>
using namespace std;

const int N = 100;
const int M = 3;
int parentSet[N];
int numRank[N];

void MakeSet()
{
	//1、初始化,每個數字的parent都是它們自己
	for (int i = 0; i < N; ++i){
		parentSet[i] = i; numRank[i] = 0;
	}
}

int FindParent(int x)
{
	if(x != parentSet[x]){
		parentSet[x] = FindParent(parentSet[x]);
	}
	return parentSet[x];
}
void UnionSet(int x, int y)
{
	if ((x = FindParent(x)) == (y = FindParent(y)))return;
	if (numRank[x] < numRank[y]){
		parentSet[x] = y;
	}
	else if (numRank[x]>numRank[y]){
		parentSet[y] = x;
	}
	else{
		parentSet[y] =x;
		++numRank[x];
	}
}
int main()
{
	//人的編號從1開始
	//哪些人屬於一個圈
	int relations[M][N] = { { 1, 2, 3 }, { 2, 3, 5 }, { 4 } };

	MakeSet();

	for (int i = 0; i < M; ++i){
		int j = 1;
		while (relations[i][j] != 0){
			UnionSet(relations[i][0], relations[i][j]);
			++j;
		}
	}

	for (int i = 0; i < N; ++i){
		cout << parentSet[i] << " ";
	}
	cout << endl; 

	system("pause");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章