并查集

特点:用集合中的一个元素代表一个集合,就像帮主代替帮派,主要分为三步,初始化,查询,合并。

用途:用来分离无环图,找到公共祖先等等。


class AndCheckSet:
    def __init__(self, n=5):#初始化
        self.fa = [0]*n
        for i in range(n):
            self.fa[i] = i

    def find(self, x):#查询
        if (self.fa[x] == x):
            return x
        else:
            return self.find(self.fa[x])

    def merge(self, i, j):#合并
        self.fa[self.find(i)] = self.find(j)


sol = AndCheckSet(n=5)
print('==sol.fa:', sol.fa)
index = sol.find(1)
print('==index:', index)

sol.merge(0, 1)
print('==sol.fa:', sol.fa)
index = sol.find(0)
print('==index:', index)


sol.merge(1, 2)
print('==sol.fa:', sol.fa)
index = sol.find(1)
print('==index:', index)

leetcode示例:

冗余连接


#并查集:合并公共节点的,对相邻节点不是公共祖先的进行合并
class Solution:
    def find(self, index):  # 查询
        if self.parent[index] == index:  # 相等就返回
            return index
        else:
            return self.find(self.parent[index])  # 一直递归找到节点index的祖先

    def union(self, i, j):  # 合并
        self.parent[self.find(i)] = self.find(j)

    def findRedundantConnection(self, edges):
        nodesCount = len(edges)
        self.parent = list(range(nodesCount + 1))
        print('==self.parent:', self.parent)

        for node1, node2 in edges:
            print('==node1, node2:', node1, node2)
            if self.find(node1) != self.find(node2):#相邻的节点公共祖先不一样就进行合并
                print('===hahhaha===')
                self.union(node1, node2)
                print('=self.parent:', self.parent)
            else:
                return [node1, node2]

        return []


edges = [[1, 2], [1, 3], [2, 3]]
sol = Solution()
res = sol.findRedundantConnection(edges)
print('=res:', res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值