`
追梦--
  • 浏览: 36989 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

数据结构——并查集

阅读更多
     让我们首先了解一下什么是并查集。并查集的英文:Disjoint Set,即“不相交集合“,将编号分别为1…N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素代表所在集合。
    常见两种操作:
        合并两个集合
        查找某元素属于哪个集合
  这也就是这种数据结构叫并查集的原因!!!,下面是一种最简单的实现方法。



  这种方法合并的时间复杂度是O(n),查找是O(1)的复杂度。伪码如下:
  
  


  
  有没有优化的方法呢?当然是有的,因为上面我们合并两个集合必须搜索整个集合。那如果我们采用树结构呢?这的确是个好想法。
  


  大致伪码如下:
  


  还可以优化,路径压缩。
  思想:每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快
  步骤:
  第一步,找到根结点
  第二步,修改查找路径上的所有节点,将它们都指向根结点
    伪码如下图:
  


  废话不多说,让我们通过实例来理解。
  畅通工程(HDOJ-1232)
  题目描述:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
  分析:若每个城市之间有且仅有一条道路相连,那这肯定是一棵树了。边数 = 节点数 -1 ,只要我们知道城市被分成的集合数ans,要修的道路就是ans-1 ,下面贴出经过路径压缩的并查集。

  
#include<iostream>
using namespace std;
int set[1005];
//带路径压缩的并查集查找 
int find(int a){
    int root = a;
    while(root!=set[root]){
        root = set[root];                       
    }
    //路径压缩 
    int i=a;
    while(i!=root){
        int j  =set[i];
        set[i] = root;
        i = j;    
    }
    return root;
}
int main(){
    int n,m,a,b;
    scanf("%d",&n);
    while(n!=0){
        scanf("%d",&m);
        for (int i=1;i<=n;i++)
           set[i] = i;
        for(int i=0;i<m;i++){
           scanf("%d%d",&a,&b);
           int aRoot=find(a);
           int bRoot=find(b);
           if(aRoot!=bRoot){
              if(aRoot<bRoot){
                 set[bRoot]=aRoot;                
              }else{
                 set[aRoot]=bRoot;      
              }  
           }       
        }
        int sum=0;
        for (int i=1;i<=n;i++){
            if(i==set[i])
               sum++;   
        }
        printf("%d\n",sum-1);
        scanf("%d",&n);            
    }
    return 0;    
} 

  • 大小: 13.3 KB
  • 大小: 8.1 KB
  • 大小: 14.6 KB
  • 大小: 9.7 KB
  • 大小: 6.6 KB
0
0
分享到:
评论

相关推荐

    基础数据结构——作为软件开发人员必须掌握的基础

    目录 • 线性结构 • 二叉堆 • 并查集 • 哈希表 • 应用举例

    数据结构与算法之并查集(不相交集合)

    并查集是一种挺高效的数据结构。实现简单,只是所有元素统一遵从一个规律所以让办事情的效率高效起来。这篇文章主要介绍了数据结构与算法——并查集(不相交集合),需要的朋友可以参考下

    数据结构算法

    经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 ...

    AcWing算法基础课模板大全

    并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历:拓扑排序 最短路 最小生成树 二分图:染色法、匈牙利算法 数学知识 —— 代码模板链接 常用代码模板4——数学...

    建议收藏算法基础课模板大全

    并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历:拓扑排序 最短路 最小生成树 二分图:染色法、匈牙利算法 数学知识 —— 代码模板链接 常用代码模板4——数学...

    大数据整理——数据集成.pdf

    ⼤数据整理 ⼤数据整理——数据集成 数据集成 数据集成 数据集成 1.背景: 背景: 因业务需要,事业单位内部普遍构建了多个异构的信息系统,这些信息系统中管理的数据源彼此独⽴、相互封闭,形成"信息孤岛"⽆法形成 ...

    C#全能速查宝典

    1.1.10 泛型——处理算法和数据结构 11 1.1.11 分部类——将一个类分成几部分 12 1.1.12 is操作符——检查变量是否为指定的类型 14 1.1.13 lock关键字——锁定 15 1.1.14 namespace关键字——定义命名空间 15 1.1.15...

    大数据导论(1)——“大数据”相关概念、5V特征、数据类型.pdf

    ⾮结构化数据,是指不遵循统⼀的数据结构或模型的数据(如⽂本、图像、视频、⾳频等),不⽅便⽤⼆维逻辑表来表现。这部分数据 在企业数据中占⽐达,且增长速率更快。⾮结构化数据更难被计算机理解,不能直接被处理...

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    6.5.4 并查集 第7章 数组和矩阵 7.1 数组 7.1.1 抽象数据类型 7.1.2 C++数组的索引 7.1.3 行主映射和列主映射 7.1.4 用数组的数组来描述 7.1.5 行主描述和列主描述 7.1.6 不规则二维数组 7.2 矩阵 7.2.1 定义和操作 ...

    论文研究-面向位置预测的动态轨迹模式挖掘.pdf

    然后提出DPTUpdate算法,设计蕴涵时空信息的快捷数据结构——DPT(dynamic pattern tree),存储和查询移动物体的T-模式,并提出Prediction算法计算最佳匹配度,得到移动对象轨迹的预测位置。基于真实数据集进行对比...

    ACM 算法经典代码 数据结构经典代码

    2. 并查集扩展(friend_enemy) 98 3. 堆(binary) 98 4. 堆(mapped) 99 5. 矩形切割 99 6. 线段树 100 7. 线段树扩展 102 8. 线段树应用 105 9. 子段和 105 10. 子阵和 105 十三. 其他 106 1. 分数 106 2. 矩阵 108 3....

    《数据结构》试题库管理系统——计算机辅助教学 (1994年)

    《数据结构》试题库管理系统集数据库管理、试卷命题、评分、统计于一体,使试卷命题、阅卷、评分等一系列复杂的操作合理化、科学化、规范化。本试题库管理系统可完成试题的增加、删除、修改及模糊查询、动态条件组合...

    大数据导论-6.1.2-熟悉大数据处理技术——大数据的技术架构.pptx

    (2)管理层:要支持在多源数据上做深层次的分析,大数据技术架构中需要一个管理平台,使结构化和非结构化数据管理融为一体,具备实时传送和查询、计算功能。本层既包括数据的存储和管理,也涉及数据的计算。并行化...

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    1.2.5 tree——目录结构 43 1.2.6 type——浏览文本 44 1.2.7 verify——校验 45 1.2.8 verifier——驱动程序检验 46 1.2.9 where——位置 47 第2章 磁盘管理 49 2.1 磁盘分区与格式化 49 2.1.1 硬盘分区 49 2.1.2 ...

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    5.5.3 FINDB——以字节为单位并区分大小写地查找指定字符的位置 187 5.5.4 REPLACE——以字符为单位根据指定位置进行替换 188 5.5.5 REPLACEB——以字节为单位根据指定位置进行替换 189 5.5.6 SEARCH——以字符...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    3.4.4 graftabl——启用扩展字符集 119 3.4.5 mode——系统设置 121 3.4.6 path——路径 125 3.4.7 reg——修改注册表子项 125 3.4.8 regedit——注册表编辑器 132 3.4.9 regsvr32——将dll文件注册为命令 132 ...

    精通windows server 2008 命令行与powershell 电子书PDF版(第四卷)

    3.4.4 graftabl——启用扩展字符集 119 3.4.5 mode——系统设置 121 3.4.6 path——路径 125 3.4.7 reg——修改注册表子项 125 3.4.8 regedit——注册表编辑器 132 3.4.9 regsvr32——将dll文件注册为命令 132 ...

    精通windows server 2008 命令行与powershell电子书PDF版(第三卷)

    3.4.4 graftabl——启用扩展字符集 119 3.4.5 mode——系统设置 121 3.4.6 path——路径 125 3.4.7 reg——修改注册表子项 125 3.4.8 regedit——注册表编辑器 132 3.4.9 regsvr32——将dll文件注册为命令 132 ...

    leetcode中国-leetcode_algo:leetcode相关算法和模板使用python

    并查集 堆 Hash表 C++ STL使用技巧 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历:拓扑排序 最短路 最小生成树 二分图:染色法、匈牙利算法 数学知识 —— 代码模板链接 常用...

Global site tag (gtag.js) - Google Analytics