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