MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

刚刚学习完并查集的基础知识.. 自己写了3个模板类 . 发上和大家分享下:

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include <iostream>
using namespace std;
typedef class arrUFS{
       public:
              arrUFS(int n = 0):N(n){ set = new int[n]; for ( int i = 0; i != N; ++ i) set[i] = i; };
              ~arrUFS(){ delete [] set; };
              int find ( int x ){ return set[x]; }
              void Merge1( int a,int b){   int i = min(set[a],set[b]);
                                           int j = max(set[a],set[b]);
                                           for ( int k=1; k<=N; k++) {
                                                 if (set[k] == j)
                                                 set[k] = i;
                                           }
                                       }
       private:
              int *set;
              int N;         
}arrUFS; // 数组形式

//树形并查集, 路径压缩 
typedef struct {
     int parent;
     int cnt;   
}Tset;

typedef class treeUFS{
       public:
              treeUFS(int n = 0):N(n+2) { set = new Tset[N]; 
                                          for ( int i = 0; i != N; ++ i) 
                                          set[i].parent = i,set[i].cnt = 1; 
                                        }
              ~treeUFS(){ delete [] set; };
              int find ( int x ){ int r = x; while ( set[r].parent != r ) //循环结束,则找到根节点
                                                    r = set[r],parent;       
                                             int i = x;
                                             while ( i != r) //本循环修改查找路径中所有节点
                                             {   
                                                 int j = set[i].parent;
                                                 set[i].parent = r;
                                                 i = j;
                                             } 
                                   return r;
                                }
              void Merge1( int x,int y ){  x = find ( x );  y = find ( y );  
                                           if ( x == y ) return;
                                           if ( set[x].cnt > set[y].cnt ){
                                                set[y].parent = x;
                                                set[x].cnt += set[y].cnt;
                                           }
                                           else{
                                                   set[x].parent = y;
                                                   set[y].cnt += set[x].cnt;        
                                               }
                                        }
       private:
              int *set;
              int N;         
}treeUFS; // 树形式  路径压缩

//属性并查集, 带树深 
typedef struct {
     int parent;
     int height;   
}Tset;

typedef class treeUFS{
       public:
              treeUFS(int n = 0):N(n+2) { set = new Tset[N];
                                          visited = new bool[N]; 
                                          for ( int i = 0; i != N; ++ i) 
                                          set[i].parent = i,set[i].height = 1,visited[i] = false; 
                                        }
              ~treeUFS(){ delete [] set; };
              int find ( int x ){  int r = x;  while ( r != set[r].parent ) r = ser[r].parent;
                                   return r;
                                }
              void Merge1( int x,int y ){  x = find ( x );  y = find ( y );  
                                           if ( x == y ) return;
                                           if ( set[x].height == set[y].height ){
                                                set[y].parent = x;
                                                set[x].height ++;
                                           }
                                           else if ( set[x].height < set[y].height ) {
                                                     set[x].parent = y;       
                                                   }
                                           else{
                                                     set[y].parent = x;
                                               }
                                        }
       private:
              int *set;
              bool *visited;
              int N;         
}treeUFS; // 树形式 带树深

int main ()
{
    return 0; 
}

转载于:https://www.cnblogs.com/MiYu/archive/2010/08/18/1802543.html

自己的 并查集 模板相关推荐

  1. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  2. 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序

    problem L3-003 社交集群 (30分) 当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友.一个"社交集群"是指部分兴趣 ...

  3. 【SCAU 新生赛】18247 aler的旅游计划 并查集模板题

    18247 aler的旅游计划 该题有题解 时间限制:1000MS 代码长度限制:10KB 提交次数:15 通过次数:0 收入:10 题型: 编程题 语言: 不限定 Description aler想 ...

  4. 强盗团伙(啊哈-并查集[模板])

    题目 快过年了,犯罪分子们也开始为年终奖"奋斗"了,小哼的家乡出现了多次抢劫事件.由于强盗人数过于庞大,作案频繁,警方想查清楚到底有几个犯罪团伙实在是太不容易了,不过警察叔叔还是搜 ...

  5. 战争来临(并查集模板题)

    战争来临(并查集模板题) 描述   那一个骑单车卖报纸的少年 恐慌的眼泪慢慢布满了侧脸----<战争世界>   B国对A国发动了侵略战争,A国不得不全力抵御.A国幅员辽阔,后方群众的支援补 ...

  6. 并查集模板题(stl 中map的运用)

    DongDong认亲戚 DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义:若A和B是亲戚,B和C是亲戚,那么A和C也是亲戚),她只好求助于会编程的 ...

  7. 并查集模板——并查集(洛谷 P3367)

    题目选自洛谷P3367 是并查集的最入门的题目,也是并查集的模板题~~ 如果你还不知道并查集是什么? 请看我的这篇文章 点击链接 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 ...

  8. 【畅通工程 HDU - 1232 】【并查集模板题】

    并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...

  9. (并查集模板)AcWing 模板+例题240.食物链

    并查集最简单的模板 #include <bits/stdc++.h>using namespace std; int p[100010]; int n,m; int Find(int x) ...

  10. SDUTOJ [2801] 并查集模板

     英语四六级系列(一) Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 众所周知,英语四六级考试有几套不同的试卷,而且,为了防 ...

最新文章

  1. js new Date()不带时分秒时,时间变了 问题解决
  2. python多进程打印输出_python 多进程日志 logging
  3. boost::hana::not_equal用法的测试程序
  4. 【SDL】SDL简介
  5. 在OpenShift上托管的WildFly实例上进行Arquillian测试
  6. 1646. 获取生成数组中的最大值
  7. 清空StringBuilder的三种方法及效率
  8. newifi3高恪魔改最新_12.08达达最新球球id账号呆瓜表
  9. 移动互联网“去哪儿”?
  10. easyui中idField的作用
  11. linux蓝牙安装程序,Linux 端蓝牙调试工具
  12. r语言 与python r中python环境的创建
  13. 关于如何查找NXP S32K1xx系列单片机的封装信息和引脚定义
  14. 动态RAM(64K*1)INTEL2164简介(抄自原理图)
  15. 手机微信打不开连接到服务器错误代码,微信打不开文件是怎么回事(微信文件错误代码90018)...
  16. 千道Java面试真题整理系列:MySQL灵魂五十问,在遇面试也不怕.
  17. 优化算法系列-模拟退火算法(1)——基本原理枯燥版本
  18. mybatic动态SQL及结果处理
  19. 模仿的豌豆荚滑动Menu 的 实现
  20. 如何使用adb工具进行查看Android中创建的数据库文件

热门文章

  1. 手把手教你强化学习(十) 基于Stochastic Policy的深度强化学习方法
  2. ubuntu16.04创建自己的桌面图标
  3. 国内外优秀的源码网站
  4. MY_0001:添加命令到自定义工具栏
  5. python学习day35 并发编程 操作系统 进程概念
  6. post提交参数有Date类型,总是返回400格式错误
  7. 几个例子弄懂JS 的setInterval的运行方式
  8. 【转】容器 C++ set和map
  9. BZOJ1934: [Shoi2007]Vote 善意的投票
  10. RandomCodeUtil随机数工具类,随机生成数字、字母、数字字母组合、中文姓名