Source code for titan_pylib.graph.get_bridge

 1from titan_pylib.others.antirec import antirec
 2
 3
[docs] 4def get_bridge(G: list[list[int]]) -> tuple[list[int], list[tuple[int, int]]]: 5 # ref: https://algo-logic.info/bridge-lowlink/ 6 7 n = len(G) 8 bridges = [] 9 articulation_points = [] 10 order = [-1] * n 11 lowlink = [0] * n 12 cur_time = 0 13 14 @antirec 15 def dfs(v: int, p: int = -1): 16 nonlocal cur_time 17 order[v] = cur_time 18 lowlink[v] = cur_time 19 cur_time += 1 20 cnt = 0 21 flag = False 22 for x in G[v]: 23 if x == p: 24 continue 25 if order[x] == -1: 26 cnt += 1 27 yield dfs(x, v) 28 if p != -1 and order[v] <= lowlink[x]: 29 flag = True 30 lowlink[v] = min(lowlink[v], lowlink[x]) 31 if lowlink[x] > order[v]: 32 bridges.append((x, v)) 33 else: 34 lowlink[v] = min(lowlink[v], order[x]) 35 if p == -1 and cnt >= 2: 36 flag = True 37 if flag: 38 articulation_points.append(v) 39 yield 40 41 for v in range(n): 42 if order[v] == -1: 43 dfs(v) 44 return articulation_points, bridges