并查集算法分析

并查集算法

一、并查集能解决哪类问题

  1. 前提条件

    • 如果A与B有关系,B与C也有关系,那么,A与C就有关系;

    • 举例:在下图中,A与B是连通的,B与C也是连通的,那么显然,A与C就是连通的。我们把A,B,C称之为节点

      B
      A
      C
  2. 问题描述

    • 在下列群节点中,已知一些节点之间的关系情况现在给出任意两个节点x和y,判断x和y是否有关系?这些节点中共有多少个独立的群体?

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13

二、怎样解决

  1. 解决思路

    • 每个群体推选出一个根节点;
    • 两个节点是否在一个群体中,只需要判断它们的根节点是否相同;
    • 有多少个根节点就有多少个群体。
  2. 实现方法(C/C++语言实现)

    • 初始化

      const int max=10000;//max为定义的最大节数
      int pre[max];//max为定义的最大节数
      void init(){//初始化,每个节点都是根节点
      	for(int i=0;i<max;i++)
      		pre[i]=i;
      }
      
    • 寻找根节点

      int find(int node){
      	while(pre[node]!=node)
      		node=pre[node];
      	return node;
      }
      
    • 并为一个集合

      void join(int node1,int node2){
      	node1=find(node1);
          node2=find(node2);
          if(node1!=node2)//判断两个节点x,y是否有联系
              pre[node1]=node2;
      }
      

三、例题

  • L 2 − 010 L2-010 L2010排座位
  • L 2 − 024 L2-024 L2024部落
  • L 2 − 007 L2-007 L2007家庭房
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值