1- from vertex import Vertex
2- 3- def find_root (vertex : Vertex = None ) -> Vertex :
4- while vertex .root != vertex :
5- vertex = vertex .root
6- return vertex
7- 8- def sort_edges_by_weight_increasingly (edges : list ) -> list :
9- # edges [[label1, label2, weight], [label1, label2, weight]]
10- if len (edges ) < 2 :
11- return edges
12- 13- pivot_index : int = len (edges ) // 2
14- pivot_value = edges [pivot_index ][2 ]
15- left_list : list = []
16- right_list : list = []
17- for i in range (len (edges )):
18- if i != pivot_index :
19- if edges [i ][2 ] < pivot_value :
20- left_list .append (edges [i ])
21- else :
22- right_list .append (edges [i ])
23- 24- return sort_edges_by_weight_increasingly (left_list ) + [edges [pivot_index ]] + sort_edges_by_weight_increasingly (right_list )
1+ from typing import Set , Dict , List , Tuple
252
3+ class Graph :
264
5+ def __init__ (self ) -> None :
6+ self .vertices :Set [str ] = set ()
7+ self .root :Dict [str , str ] = dict ()
8+ self .rank :Dict [str , int ] = dict ()
9+ self .edges :List [Tuple [str , str , int ]] = list ()
10+ self .mst :List [Tuple [str , str , int ]] = list ()
2711
28- class Graph :
29- def __init__ (self ):
30- self .vertices : dict = {}
31- self .edges : list = []
32- 33- def add_vertex (self , label : str = None ):
34- self .vertices [label ] = Vertex (label )
35- 36- def add_edge (self , vertex_1_label : str = None , vertex_2_label : str = None , weight : int = float ("inf" )):
37- if vertex_1_label not in self .vertices or vertex_2_label not in self .vertices :
38- raise Exception ("Invalid label name" )
39- self .edges .append ([vertex_1_label , vertex_2_label , weight ])
40- self .edges .append ([vertex_2_label , vertex_1_label , weight ])
41- 42- def kruskal (self ):
43- # sort edges by weight increasingly
44- self .edges = sort_edges_by_weight_increasingly (self .edges )
45- minimum_spanning_tree : list = []
46- for edge_list in self .edges :
47- vertex_one : Vertex = self .vertices [edge_list [0 ]]
48- vertex_two : Vertex = self .vertices [edge_list [1 ]]
49- 50- root_one : Vertex = find_root (vertex_one )
51- root_two : Vertex = find_root (vertex_two )
52- 53- if root_one != root_two :
54- root_one .root = root_two
55- minimum_spanning_tree .append ([vertex_one .label , vertex_two .label ])
56- 57- print (minimum_spanning_tree )
12+ 13+ def add_vertex (self , label :str ) -> None :
14+ self .vertices .add (label )
15+ self .root [label ] = label
16+ self .rank [label ] = 0
17+ 18+ 19+ def add_edge (self , label1 :str , label2 :str , weight :int ) -> None :
20+ self .edges .append ((label1 , label2 , weight ))
21+ 22+ 23+ def kruskal (self ) -> None :
24+ self .edges .sort (key = lambda edge : edge [2 ])
25+ for l1 , l2 , weight in self .edges :
26+ 27+ root1 :str = self ._find_root (l1 )
28+ root2 :str = self ._find_root (l2 )
29+ 30+ if root1 != root2 :
31+ if self .rank [root1 ] > self .rank [root2 ]:
32+ self .root [root2 ] = root1
33+ self .rank [root1 ] = self .rank [root1 ] + 1
34+ else :
35+ self .root [root1 ] = root2
36+ self .rank [root2 ] = self .rank [root2 ] + 1
37+ self .mst .append ((l1 , l2 , weight ))
38+ 39+ print (self .mst )
40+ 41+ 42+ def _find_root (self , label :str ) -> str :
43+ if self .root [label ] != label :
44+ self .root [label ] = self ._find_root (self .root [label ])
45+ return self .root [label ]
0 commit comments