并查集(不相交集)C++实现

10 篇文章 0 订阅

并查集类申明:

disjoinset.h文件

#ifndef __DIS_JOIN_SET_H__
#define __DIS_JOIN_SET_H__

#include <map>
#include <vector>

class disjoinset
{
public:
	// 构造函数
	explicit disjoinset(int n);
	
	// find操作
	int find(int x) const;
	
	// union操作
	void union_set(int r1, int r2);
	
	// 返回集合元素个数>=max_num_thresh 的集合元素,
	std::vector< std::vector<int> > get_sets(size_t max_num_thresh = 1) const;

	// 打印当前并查集信息,调试用
	void print() const;
private:
	vector<int> s;
};

#endif


disjointset.cpp文件

#include "disjoinset.h"
#include <iostream>

disjoinset::disjoinset(int n) : s(n)
{
	for (size_t i = 0; i < s.size(); ++i)
	{
		s[i] = -1;
	}
}

int disjoinset::find(int x) const
{
	if (s[x] < 0) return x;
	return find(s[x]);
}

void disjoinset::union_set(int r1, int r2)
{
	r1 = find(r1);
	r2 = find(r2);
    if (r1 == r2) return;
	if (s[r2] < s[r1])
	{
		s[r1] = r2;
	}
	else
	{
		if (s[r1] == s[r2]) 
		{
			s[r1] -= 1;
		}
		s[r2] = r1;
	}
}

std::vector<std::vector<int> > disjoinset::get_sets(size_t max_num_thresh) const
{
	std::vector<std::vector<int> > ret;
	std::map<int, vector<int> > tmp;
	for (size_t i = 0; i < s.size(); ++i)
	{
		int j = find(i);
		tmp[j].push_back(i);
	}

	for (std::map<int, std::vector<int> >::iterator it = tmp.begin(); it != tmp.end(); ++it)
	{
		if (it->second.size() >= max_num_thresh)
		{
			ret.push_back(it->second);
		}
	}
	return ret;
}

void disjoinset::print() const
{
	for (size_t i = 0; i < s.size(); ++i)
	{
		std::cout << i << ":\t" << s[i] << std::endl;
	}
}


若集合元素类型不是int类型(如string, char等类型),建立相应的string或char到int的映射表,然后使用以上并查集代码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值