目录

1192:查找集群内的关键连接(2084 分)

力扣第 154 场周赛第 4 题

题目

力扣数据中心有 n 台服务器,分别按从 0n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络,connections[i] = [a, b] 表示服务器 ab 之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。

关键连接 是在该集群中的重要连接,假如我们将它移除,便会导致某些服务器无法访问其他服务器。

请你以任意顺序返回该集群内的所有 关键连接

示例 1:

输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
输出:[[1,3]]
解释:[[3,1]] 也是正确的。

示例 2:

输入:n = 2, connections = [[0,1]]
输出:[[0,1]]

提示:

  • 2 <= n <= 105
  • n - 1 <= connections.length <= 105
  • 0 <= ai, bi <= n - 1
  • ai != bi
  • 不存在重复的连接

分析

tarjan 算法模版题,求无向图的桥。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
def criticalConnections(self, n: int, connections: List[List[int]]) -> List[List[int]]:
    def tarjan(p, fa):
        dfn[p] = low[p] = self.t = self.t+1
        for q in nxt[p]:
            if q not in dfn:
                tarjan(q, p)
                low[p] = min(low[p], low[q])
                if low[q] > dfn[p]:
                    bridge.append([p, q])
            elif q != fa:
                low[p] = min(low[p], dfn[q])
    
    nxt = defaultdict(list)
    for a, b in connections:
        nxt[a].append(b)
        nxt[b].append(a)
    bridge, dfn, low, self.t = [], {}, {}, 0
    tarjan(0, None)
    return bridge

620 ms