Source code for titan_pylib.graph.namori
[docs]
1class Namori:
2
3 def __init__(self, G: list[list[int]]):
4 n = len(G)
5 deg = [0] * n
6 for v in range(n):
7 for x in G[v]:
8 deg[x] += 1
9 todo = [i for i, x in enumerate(deg) if x == 1]
10 cycle = set(range(n))
11 while todo:
12 v = todo.pop()
13 cycle.discard(v)
14 for x in G[v]:
15 deg[x] -= 1
16 if deg[x] == 1:
17 todo.append(x)
18 tree = []
19 treeid = [-1] * n
20 now = 0
21 cycle_list = list(cycle)
22 for i in cycle_list:
23 tmp = []
24 todo = [i]
25 treeid[i] = now
26 while todo:
27 v = todo.pop()
28 tmp.append(v)
29 for x in G[v]:
30 if treeid[x] != -1 or x in cycle:
31 continue
32 todo.append(x)
33 treeid[x] = now
34 now += 1
35 tree.append(tmp)
36 # tree[i]:= cycle[i]を根とする木
37 # tree[i][0]は常に根
38 self.cycle = cycle_list
39 self.tree = tree
40 self.treeid = treeid
41
[docs]
42 def same_tree(self, u: int, v: int) -> bool:
43 return self.treeid[u] == self.treeid[v]
44
[docs]
45 def get_cycle(self):
46 return self.cycle
47
[docs]
48 def get_tree(self):
49 return self.tree