力扣数据中心有 n
台服务器,分别按从 0
到 n-1
的方式进行了编号。
它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群,其中连接 connections
是无向的。
从形式上讲,connections[i] = [a, b]
表示服务器 a
和 b
之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。
「关键连接」是在该集群中的重要连接,也就是说,假如我们将它移除,便会导致某些服务器无法访问其他服务器。
请你以任意顺序返回该集群内的所有 「关键连接」。
示例 1:
输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
输出:[[1,3]]
解释:[[3,1]] 也是正确的。
提示:
1 <= n <= 10^5
n-1 <= connections.length <= 10^5
connections[i][0] != connections[i][1]
- 不存在重复的连接
思路:
这是亚麻最近的OA题,critical connections, 详解可见:
https://www.geeksforgeeks.org/bridge-in-a-graph/
from collections import defaultdict
class Solution(object):
def criticalConnections(self, n, connections):
"""
:type n: int
:type connections: List[List[int]]
:rtype: List[List[int]]
"""
visited = set()
low = [9999999] * n
discover = [999999] * n
parent = [-1] * n
graph = defaultdict(list)
self.time = 0
res = []
for u, v in connections:
graph[u].append(v)
graph[v].append(u)
def dfs(u):
visited.add(u)
discover[u] = self.time
low[u] = self.time
self.time += 1
for v in graph[u]:
if v not in visited:
parent[v] = u
dfs(v)
low[u] = min(low[u], low[v])
if low[v] > discover[u]:
res.append([u, v])
elif v != parent[u]:
low[u] = min(low[u], discover[v])
for i in range(n):
if i not in visited:
dfs(i)
return res