File tree Expand file tree Collapse file tree 3 files changed +72
-0
lines changed
graphs/union-find/union-find-path-compression Expand file tree Collapse file tree 3 files changed +72
-0
lines changed Original file line number Diff line number Diff line change 1+ from vertex import Vertex
2+
3+
4+ class Graph :
5+
6+ def __init__ (self ):
7+ self .vertices : dict = {}
8+ self .edges : list = []
9+
10+ def add_vertex (self , label : str = None ):
11+ self .vertices [label ] = Vertex (label )
12+
13+ def add_edge (self , label1 : str , label2 : str ):
14+ self .edges .append ([label1 , label2 ])
15+
16+ def union_find (self ):
17+
18+ for edge in self .edges :
19+ label_one : str = edge [0 ]
20+ label_two : str = edge [1 ]
21+ vertex_one = self .vertices [label_one ]
22+ vertex_two = self .vertices [label_two ]
23+
24+ root_one : Vertex = self .find_root (vertex_one )
25+ root_two : Vertex = self .find_root (vertex_two )
26+
27+ if root_one != root_two :
28+ if root_one .rank > root_two .rank :
29+ root_two .parent = root_one
30+ root_one .rank = root_one .rank + 1
31+ else :
32+ root_one .parent = root_two
33+ root_two .rank = root_two .rank + 1
34+
35+ def find_root (self , vertex : Vertex ):
36+ if vertex .parent != vertex :
37+ vertex .parent = self .find_root (vertex .parent )
38+ return vertex .parent
39+ return vertex .parent
Original file line number Diff line number Diff line change 1+ from graph import Graph
2+ from vertex import Vertex
3+
4+ g : Graph = Graph ()
5+ g .add_vertex ('a' )
6+ g .add_vertex ('b' )
7+ g .add_vertex ('c' )
8+ g .add_vertex ('d' )
9+ g .add_vertex ('e' )
10+ g .add_vertex ('f' )
11+
12+ g .add_edge ('a' , 'b' )
13+ g .add_edge ('c' , 'd' )
14+ g .add_edge ('d' , 'e' )
15+ g .add_edge ('c' , 'f' )
16+ g .add_edge ('f' , 'b' )
17+
18+ g .union_find ()
19+
20+ for label in g .vertices :
21+ vertex : Vertex = g .vertices [label ]
22+ print (f'{ vertex .label } parent is { vertex .parent .label } , rank is { vertex .parent .rank } ' )
23+
24+
25+
26+
Original file line number Diff line number Diff line change 1+ class Vertex :
2+
3+ def __init__ (self , label : str = None ):
4+ self .label = label
5+ self .parent : 'Vertex' = self
6+ self .rank : int = 0
7+
You can’t perform that action at this time.
0 commit comments