`
追梦--
  • 浏览: 38036 次
  • 性别: 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
分享到:
评论

相关推荐

    在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合 并查集

    在一些有N个元素的集合应用问题中,我们通常是在开始时让每...即使在空间上能勉强通过,运行的时间复杂度也极高,根本不可能在比赛规定的运行时间内计算出试题需要的结果,只能采用一种特殊数据结构——并查集来描述。

    食物链(并查集) C

    在IT领域,特别是算法设计与分析中,"食物链(并查集) C"是一个典型的问题,它结合了生物学中的食物链概念与计算机科学中的数据结构——并查集。本问题要求我们用C语言实现一个解决方案,以表示和操作生态系统中的...

    数据结数据结构数据结构数据结构课件

    在本课件中,主要讨论了一种特殊的数据结构——并查集(Union-Find),它用于处理等价关系问题。 等价关系是指在一组对象上定义的关系,满足自反性、对称性和传递性。例如,整数集合中的“等于”关系,或者人与人...

    数据结构——航空客运订票系统(c语言)

    "数据结构——航空客运订票系统(C语言)"表明这个项目旨在应用数据结构的知识来设计一个航空订票的模拟系统。C语言是一种底层、高效的编程语言,适合实现这样的系统,因为它允许程序员对内存进行直接操作,从而优化...

    数据结构——严蔚敏

    总的来说,严蔚敏的《数据结构》资料集为学习者提供了一套完整的数据结构学习资源,涵盖了理论讲解、实例演示、编程实践和习题解答,是学习数据结构不可多得的参考资料。无论你是初学者还是有经验的开发者,都可以...

    数据结构——最小生成树C代码

    为了检查新边是否形成环路,我们可以使用并查集数据结构来维护边的连通性。 在C代码实现中,需要注意以下几点: 1. 数据结构的选择:根据算法的不同,可能需要实现邻接矩阵、邻接表或并查集。邻接矩阵适用于表示边...

    高级数据结构——Advanced Data Structures电子书

    5. **并查集(Union-Find Structures)**:一种用于维护元素集合的数据结构,支持并集(Union)和查找(Find)操作。 6. **动态化和持久化**:通过这两种技术,可以使数据结构支持更复杂的操作,如时间旅行查询等...

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

    ### 基础数据结构——作为软件开发人员必须掌握的基础 #### 一、线性结构 线性结构是计算机科学中最基本的数据结构之一,主要包括数组、链表等。本节重点介绍带头结点的双链表及其应用。 ##### 基础知识 - **...

    FFF.rar_最小生成树 实验

    2. **并查集**:为处理边的连通性,我们需要一个数据结构——并查集。它能快速判断两个顶点是否属于同一个集合,同时支持合并两个集合的操作。 3. **遍历边**:从最小的边开始遍历,对于每条边,检查其连接的两个...

    数据结构——图的应用(通信网络).zip

    并查集是一种有效的数据结构,可以快速检测和维护网络的连通性。 9. **路由算法**:在通信网络中,数据包需要从源设备传送到目的设备。路由选择算法,如OSPF(开放最短路径优先)和BGP(边界网关协议),用于确定...

    并查集和DFA——北京大学暑期课《ACM/ICPC竞赛训练》

    并查集(Disjoint Set)和确定有限自动机(Deterministic Finite Automaton,简称DFA)是计算机科学中两种重要的数据结构与算法。在解决不同的问题时,它们各自发挥着独特的作用。 首先,我们来详细了解一下并查集...

    最小生成树问题,图形输出最小生成树.docx

    在这个过程中,我们需要用到一种数据结构——并查集(Disjoint Set),也叫MFSet,它用于表示图中各个顶点的连通性,以便在添加边时快速判断是否形成环路。 在程序设计上,首先需要定义图的抽象数据类型(ADT Graph...

    一种新型整数集上的动态统计数据结构——Irie.pdf

    Trie树是一种特殊的树形数据结构,通常用来存储大量字符串,并通过利用字符串之间的公共前缀来减少存储空间的需求。Trie树有三个基本性质:一是根节点不含字符,二是从根节点到任意节点的路径上所有字符连接起来表示...

    并查集C/C++代码实现

    并查集是一种用于处理元素集合的动态集合问题的数据结构,它支持两种基本的操作:**并**和**查**。并查集的主要用途是判断一个元素是否属于某个集合,并且能够有效地将两个集合合并。在实际应用中,它被广泛应用于图...

    数据结构——图的最小生成树(邻接矩阵、普利姆)

    ### 数据结构——图的最小生成树(邻接矩阵、普利姆) #### 概述 在计算机科学领域,图是一种非常重要的数据结构,用于表示实体之间的关系。在图论中,一个图由顶点集(节点)和边集组成,其中边连接两个顶点来...

    acm算法--并查集详解

    并查集是一个非常重要的数据结构,在 ACM 竞赛中经常出现,今天我们来详细讲解并查集算法及其应用。 什么是并查集? 并查集是一种数据结构,它可以高效地解决连通性问题。所谓连通性问题,就是判断两个点之间是否...

    数据结构与算法分析——C++语言描述第三版习题答案

    8. **不相交集合**:介绍并查集数据结构,用于处理动态连通性问题。 9. **图算法**:研究图的基本概念、遍历算法(如DFS、BFS)以及最短路径问题等。 10. **算法设计技巧**:提供解决特定问题的通用方法,如分治法、...

    c++实现并查集

    并查集是一种树形的数据结构,常用于处理一些不交集的合并及查询问题,可以高效地进行集合的合并与查找操作。本文将介绍如何用C++语言实现一个简单的并查集,并通过具体的代码示例来演示其实现过程。 #### 核心概念...

    12. 并查集-如何快速判断节点连通性1

    并查集是一种高效的数据结构,主要用于处理集合的联通性问题,尤其在判断两个节点是否属于同一个连通分量时表现出色。它由数组构建,数组的下标对应于节点,数组的值则用来表示节点之间的连通关系。下面将详细讨论并...

Global site tag (gtag.js) - Google Analytics