LeetCode——1319.连通网络的操作次数

class Solution:
    def makeConnected(self, n: int, connections: List[List[int]]) -> int:
        
        #我们可以通过节点集合 VV 唯一地描述一个连通分量:
        #例如在题目给出的样例 11 中,有两个连通分量,如果让三个连通分量相连至少需要n-1条线
        #样例 22 中,有三个连通分量,如果需要让连接的话那就需要n-1条线

        #因此题目就转化如何求图中极大连通分量的个数了
        #操作次数=极大连通分量个数-1


        #如果线缆的数量是小于n-1台电脑直接返回-1,因为不管怎么连接也连接不了
        if len(connections) < n - 1:
            return -1
        graph = defaultdict(list)
        #建图
        for i, pair in enumerate(connections):
            x = pair[0]
            y = pair[1]
            graph[x].append(y)
            graph[y].append(x)
            
        
        #寻找极大连通分量的个数
        def dfs(index,visited):
            for neighbor in graph[index]:
                if not visited[neighbor]:
                    visited[neighbor]=1
                    dfs(neighbor,visited)

        #设置一个标记符号
        visited = [0]*n
        #计算有几个连通分量
        count = 0
        for i in range(n):
            if not visited[i]:
                dfs(i,visited)
                count+=1        
        #最少操作次数应该为极大连通分量数-1
        return count-1
  • 题目的思想还是比较简单的就是不是很好理解
  • 如果有n太机器把他们连起来至少需要n-1条线
    • 如果线的数量少于n-1条,那么很显然是不能连接的
    • 接下来可以使用图的思想去解决这个问题
      • 可以把每台计算机想成图中的一个节点
      • 然后计算这个图的极大连通分量的的个数,这个数量也就是不想连的计算机总共分了几个区域
      • 假设有m个极大连通分量,那么就说明至少需要m-1条线才能将这几个极大连通分量连起来
      • 一旦将极大联通分量连起来之后那么所有的主机都可以连接起来了
    • 接下来进入代码阶段
      • 通过字典先建图
      • 然后给一个数组标记已经访问过的节点
      • 然后在写一个求图的极大连通分量个数的dfs函数
      • 然后遍历图中的点,求总共有几个极大联通分量即可
      • 最终需要至少的操作数就等于极大联通分量的个数-1

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/113063401