首页 > 其他 > 详细

591. 连接图 III

时间:2020-07-08 22:32:42      阅读:63      评论:0      收藏:0      [点我收藏+]

591. 连接图 III

中文English

给一个图中的 n 个节点, 记为 1 到 n . 在开始的时候图中没有边.
你需要完成下面两个方法:

  1. connect(a, b), 添加一条连接节点 a, b的边
  2. query(), 返回图中联通区域个数

样例

例1:

输入:
ConnectingGraph3(5)
query()
connect(1, 2)
query()
connect(2, 4)
query()
connect(1, 4)
query()

输出:[5,4,3,3]

例2:

输入:
ConnectingGraph3(6)
query()
query()
query()
query()
query()


输出:
[6,6,6,6,6]
输入测试数据 (每行一个参数)如何理解测试数据?

 并查集 union find

class ConnectingGraph3:
    """
    @param a: An integer
    @param b: An integer
    @return: nothing
    """
    def __init__(self, n):
        # initialize your data structure here.
        self.count = n
        self.father = {}
        for i in range(1, n + 1):
            self.father[i] = i 
            
    def connect(self, a, b):
        # write your code here
        root_a = self.find(a)
        root_b = self.find(b)

        if (root_a != root_b):
            #a的父节点指向b(均是根节点,根节点连接)
            self.father[root_a] = root_b 
            self.count -= 1 

    """
    @return: An integer 
    """
    def query(self):
        # write your code here
        return self.count

    #找根节点
    def find(self,num):
        origin_num = num
        #如果是相等的话,则直接返回本身
        if self.father[num] == num:
            return num

        #如果不相等的话,则找父节点,一直更新到根节点
        while num != self.father[num]:
            num = self.father[num]

        #最后,压缩路径
        #一直到最后一个根节点为止,原始值的所有父节点都指向根节点
        while self.father[origin_num] != num:
            temp = self.father[origin_num]
            self.father[origin_num] = num
            origin_num = temp  
        
        #最终返回根节点
        return num

 

591. 连接图 III

原文:https://www.cnblogs.com/yunxintryyoubest/p/13269639.html

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