IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C并查集的两个重要函数union和find的实现C++ -> 正文阅读

[数据结构与算法]C并查集的两个重要函数union和find的实现C++

今天看了并查集的实现,重点是两个函数find 以及union 现记录如下。
视频参考
讲解

#include <iostream>
#include<vector>
using namespace std;
//中间包括了find与union的快和慢的版本
class UnionFind
{
public:
	//find 快 union慢
	int size;
	vector<int> data;
	UnionFind(int _size = 5) :size(_size) {
		cout <<"size " <<size << endl;
		data.resize(size);
	for (int i = 0; i < size; i++)
		data[i] = i;
	
	}

	int find(int index)
	{    
		if (index >= size)
		{
			cout << "index " << index << endl;
			cout << "error " << endl;
			return -1;
		}
		return data[index];
	}

	int Quick_Find(int index)
	{
		while (index != data[index])
		{
			index = data[index];
		}
		return index;
	}
	void union_x_y(int x, int y);
	void Quick_union_x_y(int x,int y)
	{
		int temp_x = find(x);
		int temp_y = find(y);

		if (temp_x != temp_y)
		{
			data[temp_y] = temp_x;
		}
	}
	bool isconnect(int x, int y)
	{
		return Quick_Find(x) == Quick_Find(y);
	}


};

void UnionFind::union_x_y(int x, int y)
{
	int temp_x = find(x);
	int temp_y = find(y);

	

	if (temp_x != temp_y)
	{
		for (int i = 0; i < size; i++)
		{
			if (data[i] == temp_y)
				data[i] = temp_x;
		}
	}
}
//按照秩合并
class Union_Rank
{
public:
	int size;
	vector<int>data;
	vector<int>rank;

	Union_Rank(int _size = 10) :size(_size)
	{
		data.resize(size, 0);
		for (int i = 0; i < size; i++)
			data[i] = i;
		rank.resize(size, 1);
	}

	int find(int index)
	{
		if (index >= size)
		{
			cout << "error " << endl;
			return -1;
		}
		while (index != data[index])
			index = data[index];

		return index;
	}

	void union_x_y(int x, int y)
	{
		int temp_x = find(x);
		int temp_y = find(y);

		if (temp_x != temp_y)
		{
			if (rank[temp_x] > rank[temp_y])
				data[temp_y] = temp_x;
			else
				if (rank[temp_x] < rank[temp_y])
					data[temp_x] = temp_y;
				else
				{
					data[temp_x] = temp_y;
					rank[temp_y]++;
				}
		}
	}

	bool is_connect(int x,int y)
	{

		return find(x) == find(y);
	}

};



//压缩路径递归思想
class Union_Pres
{
	vector<int>data;
	
	int size;
	Union_Pres(int _size = 100) :size(_size)
	{
		data.resize(size);
		for (int i = 0; i < size; i++)
			data[i] = i;
	}

	int find(int index)
	{
		if (index >= size)
		{
			cout << "error " << endl;
			return -1;
		}

		if (index == data[index])
			return index;

		return data[index] = find(data[index]);
	}


	void union_x_y(int x,int y)
	{
		int temp_x = find(x);
		int temp_y = find(y);

		if (temp_y != temp_x)
		{

			data[temp_y] = temp_x;
		}

	}


};



//基于压缩与按照秩合并
class Union_Final
{
	vector<int>data;
	vector<int>rank;
	int size;
	Union_Final(int _size=100):size(_size)
	{
		data.resize(size);
		rank.resize(size,1);
		for (int i=0;i<size;i++)
		{
			data[i] = i;
		}

		
	}
	
	int find(int x)
	{
		if (x == data[x])
			return x;

		return data[x] = find(data[x]);

	}
		//按秩合并
	void union_x_y(int x, int y)
	{
		int temp_x = find(x);
		int temp_y = find(y);

		if (temp_x != temp_y)
		{	
			if (rank[temp_x] > rank[temp_y])
			{
				data[temp_y] = temp_x;

			}
			else
			{
				if(rank[temp_x] < rank[temp_y])
					data[temp_x] = temp_y;
				else
				{
					data[temp_x] = temp_y;
					temp_y++;
				}

			}
		
		}
	}

};
int main()
{
	int size = 100;
	Union_Rank test(size);
	

	test.union_x_y(1, 3);
	test.union_x_y(2, 5);
	test.union_x_y(3, 7);
	
	if (test.is_connect(1, 7))
		cout << "connected " << endl;
		

	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:51:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:58:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码