66import inspect
77import math
88
9-
109class Graph (object ):
1110 """Graph object
1211 Creates the graph
@@ -37,56 +36,65 @@ def get_code(self):
3736 """
3837 return inspect .getsource (Graph )
3938
40-
4139class WeightedGraph (object ):
4240 """WeightedGraph object
4341 A graph with a numerical value (weight) on edges
4442 """
4543
4644 def __init__ (self ):
47- self .edges_weighted = []
4845 self .vertexes = set ()
49- self .forest = None
46+ self .graph = {}
47+ self ._forest = None
48+
49+ def get_weight (self , u , v ):
50+ """
51+ Returns the weight of an edge between vertexes u and v.
52+ If there isnt one: return None.
53+ """
54+ return self .graph .get ((u ,v ), self .graph .get ((v ,u ), None ))
55+
5056
5157 def add_edge (self , u , v , weight ):
5258 """
5359 :param u: from vertex - type : integer
5460 :param v: to vertex - type : integer
5561 :param weight: weight of the edge - type : numeric
5662 """
57- edge = ((u , v ), weight )
58- self .edges_weighted .append (edge )
59- self .vertexes .update ((u , v ))
63+ if self .get_weight (u , v ) != None :
64+ print ("Such edge already exists!" )
65+ else :
66+ self .vertexes .update ((u , v ))
67+ self .graph [(u ,v )] = weight
6068
6169 def print_graph (self ):
6270 """
6371 Print the graph
6472 :return: None
6573 """
66- for (u , v ), weight in self .edges_weighted :
67- print ("%d -> %d weight: %d" % (u , v , weight ))
74+ for (u , v ) in self .graph :
75+ print ("%d -> %d weight: %d" % (u , v , self . graph [( u , v )] ))
6876
69- def __set_of (self , vertex ):
77+ def _set_of (self , vertex ):
7078 """
7179 Helper method
7280 :param vertex:
7381 :return:
7482 """
75- for tree in self .forest :
83+ for tree in self ._forest :
7684 if vertex in tree :
7785 return tree
7886 return None
7987
80- def __union (self , u_set , v_set ):
88+ def _union (self , u_set , v_set ):
8189 """
8290 Helper method
8391 :param u_set:
8492 :param v_set:
8593 :return:
8694 """
87- self .forest .remove (u_set )
88- self .forest .remove (v_set )
89- self .forest .append (v_set + u_set )
95+ self ._forest .remove (u_set )
96+ self ._forest .remove (v_set )
97+ self ._forest .append (v_set + u_set )
9098
9199 def kruskal_mst (self ):
92100 """
@@ -96,14 +104,14 @@ def kruskal_mst(self):
96104 Author: Michele De Vita <mik3dev@gmail.com>
97105 """
98106 # sort by weight
99- self .edges_weighted . sort ( key = lambda pair : pair [ 1 ])
107+ self .graph = { k : self . graph [ k ] for k in sorted ( self . graph , key = self . graph . get , reverse = False )}
100108 edges_explored = []
101- self .forest = [[v ] for v in self .vertexes ]
102- for (u , v ), weight in self .edges_weighted :
103- u_set , v_set = self .__set_of (u ), self .__set_of (v )
109+ self ._forest = [[v ] for v in self .vertexes ]
110+ for (u , v ) in self .graph :
111+ u_set , v_set = self ._set_of (u ), self ._set_of (v )
104112 if u_set != v_set :
105- self .__union (u_set , v_set )
106- edges_explored .append (((u , v ), weight ))
113+ self ._union (u_set , v_set )
114+ edges_explored .append (((u , v ), self . graph [ u , v ] ))
107115 return edges_explored
108116
109117 # TODO: Is this necessary?
0 commit comments