File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import inspect
77
import math
88

9-
109
class 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-
4139
class 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 <[email protected]>
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

Comments
 (0)