• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Getsun
博客园    首页    新随笔    联系   管理    订阅  订阅

并查集(路径压缩 + 启发式合并 + 非递归)

问题引入:

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系?

 

先说明一下并查集的概念:(以下摘抄于 OI wiki  https://oi-wiki.org/)

 

并查集是一种树形的数据结构,顾名思义,它用于处理一些不交集的 合并 及 查询 问题。 它支持两种操作:

  • 查找(Find):确定某个元素处于哪个子集;

  • 合并(Union):将两个子集合并成一个集合。

以下给出简单代码

    for(int i=1;i<=n;i++)   father[i]=i;   //初始化
int find(int x)     //简单查找
{
    if(x==father[x])  return x;
    return father[x]=find(father[x]);  //路径压缩
}
int find2(int x)      //非递归并查集
{
    int k=x,w;
    while(father[x]!=x)   x=father[x];
    while(father[k]!=k)
    {
        w=father[k];
        father[k]=x;
        k=w;
    }
    return x;
}
void unionSet(int x, int y)    //启发式合并
 {
    int xx = find(x), yy = find(y);
    if (xx == yy) return;
    if (siz[xx] > siz[yy])   swap(xx, yy);
     father[xx] = yy;
     siz[yy] += siz[xx];
}   

 

一些题目:

模板(https://www.luogu.com.cn/problem/P3367)

亲戚  (https://www.luogu.com.cn/problem/P1551)

食物链(https://www.luogu.com.cn/problem/P2024)

 

posted @ 2020-07-26 19:49  Getsun  阅读(506)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3