Skip to content

Commit fcdf9c4

Browse files
authored
Create 1489-find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree.py
1 parent 2737282 commit fcdf9c4

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class UnionFind:
2+
def __init__(self, n):
3+
self.par = [i for i in range(n)]
4+
self.rank = [1] * n
5+
6+
def find(self, v1):
7+
while v1 != self.par[v1]:
8+
self.par[v1] = self.par[self.par[v1]]
9+
v1 = self.par[v1]
10+
return v1
11+
12+
def union(self, v1, v2):
13+
p1, p2 = self.find(v1), self.find(v2)
14+
if p1 == p2:
15+
return False
16+
if self.rank[p1] > self.rank[p2]:
17+
self.par[p2] = p1
18+
self.rank[p1] += self.rank[p2]
19+
else:
20+
self.par[p1] = p2
21+
self.rank[p2] += self.rank[p1]
22+
return True
23+
24+
class Solution:
25+
def findCriticalAndPseudoCriticalEdges(self, n: int, edges: List[List[int]]) -> List[List[int]]:
26+
# Time: O(E^2) - UF operations are assumed to be approx O(1)
27+
for i, e in enumerate(edges):
28+
e.append(i) # [v1, v2, weight, original_index]
29+
30+
edges.sort(key=lambda e: e[2])
31+
32+
mst_weight = 0
33+
uf = UnionFind(n)
34+
for v1, v2, w, i in edges:
35+
if uf.union(v1, v2):
36+
mst_weight += w
37+
38+
critical, pseudo = [], []
39+
for n1, n2, e_weight, i in edges:
40+
# Try without curr edge
41+
weight = 0
42+
uf = UnionFind(n)
43+
for v1, v2, w, j in edges:
44+
if i != j and uf.union(v1, v2):
45+
weight += w
46+
if max(uf.rank) != n or weight > mst_weight:
47+
critical.append(i)
48+
continue
49+
50+
# Try with curr edge
51+
uf = UnionFind(n)
52+
uf.union(n1, n2)
53+
weight = e_weight
54+
for v1, v2, w, j in edges:
55+
if uf.union(v1, v2):
56+
weight += w
57+
if weight == mst_weight:
58+
pseudo.append(i)
59+
return [critical, pseudo]

0 commit comments

Comments
 (0)