首页 > 其他 > 详细

并查集

时间:2020-05-05 10:16:18      阅读:70      评论:0      收藏:0      [点我收藏+]

1、并查集是一种树形结构,用户处理不相交数据的合并和查询问题。

2.、并查集操作:

  a,find 查询是否是同一颗数

 b,树合并

3、算法模板

# 递归查parent,并赋值 
def find(self, i, relation):
        if not relation[i] == i:
            relation[i] = self.find(relation[i], relation)
        return relation[i]

# 合并操作,约定取值较小者
    def union(self, i, j, relation):        
        re_i = self.find(i, relation)
        re_j = self.find(j, relation)
        if re_i < re_j:
            relation[re_j] = re_i
        elif re_i > re_j:
            relation[re_i] = re_j

1、对关系,遍历执行 union操作
2、然后针对关系list,执行find,让所有元素找到最终的parent

  

 

3、例题

547. 朋友圈

https://leetcode-cn.com/problems/friend-circles/

class Solution:

    def find(self, i, relation):
        if not relation[i] == i:
            relation[i] = self.find(relation[i], relation)
        return relation[i]

    def union(self, i, j, relation):        
        re_i = self.find(i, relation)
        re_j = self.find(j, relation)
        if re_i < re_j:
            relation[re_j] = re_i
        elif re_i > re_j:
            relation[re_i] = re_j

    def findCircleNum(self, M: List[List[int]]) -> int:
        M_len = len(M[0])
        relation = [i for i in range(M_len)]
        for i in range(M_len):
            for j in range(i + 1, M_len):
                if M[i][j] == 1:
                    self.union(i, j, relation)

        print(relation)
        for i in range(len(M)):
            self.find(i, relation)
        return len(set(relation))

  

 

https://blog.csdn.net/qq_41593380/article/details/81146850

https://blog.csdn.net/yangrujing/article/details/51868630

并查集

原文:https://www.cnblogs.com/pyclq/p/12829171.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!