Description
There are n computers numbered from 0 to n-1 connected by ethernet cables connections forming a network where connections[i] = [a, b] represents a connection between computers a and b. Any computer can reach any other computer directly or indirectly through the network.
Given an initial computer network connections. You can extract certain cables between two directly connected computers, and place them between any pair of disconnected computers to make them directly connected. Return the minimum number of times you need to do this in order to make all the computers connected. If it’s not possible, return -1.
Example 1:
Input: n = 4, connections = [[0,1],[0,2],[1,2]]
Output: 1
Explanation: Remove cable between computer 1 and 2 and place between computers 1 and 3.
Example 2:
Input: n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]
Output: 2
Example 3:
Input: n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]
Output: -1
Explanation: There are not enough cables.
Example 4:
Input: n = 5, connections = [[0,1],[0,2],[3,4],[2,3]]
Output: 0
Constraints:
- 1 <= n <= 10^5
- 1 <= connections.length <= min(n*(n-1)/2, 10^5)
- connections[i].length == 2
- 0 <= connections[i][0], connections[i][1] < n
- connections[i][0] != connections[i][1]
- There are no repeated connections.
- No two computers are connected by more than one cable.
分析
题目的意思是:求移动图的边使得图相连,即构成一个连通图。至少需要n-1条边才能保证图是相连的,因此如果没有至少n-1条边,都返回-1.接下来就是递归了,找出独立的连通部分,称为簇,然后簇的个数-1就是答案了,为了避免重复递归,这里用visited来记录遍历过的节点。
代码
class Solution:
def dfs(self,graph,visited,node):
visited[node]=True
for nei in graph[node]:
if(visited[nei]==False):
self.dfs(graph,visited,nei)
def makeConnected(self, n: int, connections: List[List[int]]) -> int:
graph=defaultdict(list)
visited=[False for _ in range(n)]
if(len(connections)<n-1):
return -1
for con in connections:
graph[con[0]].append(con[1])
graph[con[1]].append(con[0])
res=0
for i in range(n):
if(visited[i]==False):
res+=1
self.dfs(graph,visited,i)
return res-1