返回介绍

二、代码

发布于 2025-02-17 12:55:39 字数 963 浏览 0 评论 0 收藏 0

1.UnionFindSet.h

/* 
UnionFindSet.h 
并查集,非递归方法,含路径压缩,数组从 0 开始
*/ 
#include <iostream>   
using namespace std;  

#define MAXN 30005  

class UFS
{
public:
  int n;
  int p[MAXN+1];//集合根结点
  int rank[MAXN+1];  //集合中点的个数
public:
  UFS(int size = MAXN);
  void clear();
  int Find_Set(int x);
  //a 并入 b 中,不区分大小
  void Union(int x, int y);
  void Make_Set(int x);
  void Link(int x, int y);
};
UFS::UFS(int size):n(size)
{
  //必须从 0 开始
  for(int i = 0; i <= n; i++)  
    Make_Set(i);  
}
void UFS::Make_Set(int x)
{
  p[x] = x;
  rank[x] = 0;
}
void UFS::clear()
{
  for(int i = 0; i <= n; i++)  
    Make_Set(i);
}
int UFS::Find_Set(int x)
{
  if(x != p[x])
    p[x] = Find_Set(p[x]);
  return p[x];
}
void UFS::Union(int x, int y)
{
  Link(Find_Set(x), Find_Set(y));
}
void UFS::Link(int x, int y)
{
  if(rank[x] > rank[y])
    p[y] = x;
  else
  {
    p[x] = y;
    if(rank[x] == rank[y])
      rank[y]++;
  } 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文