33class Graph :
44 def __init__ (self , size : int = 10 ):
55 self .vertices : list = []
6- self .adjacencyMatrix = [[float ("inf" ) for x in range (size )] for y in range (size )]
7- self .adjacencyList : dict = {}
86 self .prev : dict = {}
7+ self .adjacencyMatrix : list = [[None for x in range (size )] for y in range (size )]
98 self .visited : dict = {}
109
11- def addVertex (self , label : str , weight :int = float ("inf" )):
12- vertex : Vertex = Vertex (label , weight )
13- vertex .index = len (self .vertices )
10+ def addVertex (self , label : str ):
11+ vertex : Vertex = Vertex (label , float ("inf" ), len (self .vertices ))
1412 self .vertices .append (vertex )
1513 self .prev [label ] = None
16- self .adjacencyList [label ] = []
1714 self .visited [label ] = False
1815
1916 def addEdge (self , label1 : str , label2 : str , weight : int ):
2017 index1 : int = self .findIndexByLabel (label1 )
2118 index2 : int = self .findIndexByLabel (label2 )
2219 self .adjacencyMatrix [index1 ][index2 ] = weight
23-
20+
2421 def dijkstra (self , label : str ):
2522 index : int = self .findIndexByLabel (label )
26- current : Vertex = self .vertices [index ]
27- current .weight = 0
28- while current is not None :
29- for i in range (len (self .adjacencyMatrix [current .index ])):
30- if self .adjacencyMatrix [current .index ][i ] != float ("inf" ):
31- if current .weight + self .adjacencyMatrix [current .index ][i ] < self .vertices [i ].weight :
32- self .vertices [i ].weight = current .weight + self .adjacencyMatrix [current .index ][i ]
33- self .prev [self .vertices [i ].label ] = current .label
34- self .visited [current .label ] = True
35- current : Vertex = self .findCheapestVertex ()
36-
37- def findCheapestVertex (self )-> Vertex :
38- current : Vertex = None
39- for vertex in self .vertices :
40- if self .visited [vertex .label ] == False :
41- if current is None :
42- current = vertex
43- elif current .weight > vertex .weight :
44- current = vertex
45- return current
46-
47- def showPath (self , label : str )-> str :
23+ self .vertices [index ].weight = 0
24+ tmpVertex : Vertex = self .vertices [index ]
25+ neighbour : Vertex
26+ while tmpVertex is not None :
27+ for neighbourIndex in range (len (self .adjacencyMatrix [tmpVertex .index ])):
28+ if self .adjacencyMatrix [tmpVertex .index ][neighbourIndex ] is not None :
29+ neighbour = self .vertices [neighbourIndex ]
30+ if tmpVertex .weight + self .adjacencyMatrix [tmpVertex .index ][neighbour .index ] < neighbour .weight :
31+ self .prev [neighbour .label ] = tmpVertex .label
32+ neighbour .weight = tmpVertex .weight + self .adjacencyMatrix [tmpVertex .index ][neighbour .index ]
33+ self .visited [tmpVertex .label ] = True
34+ tmpVertex = self .findUnvisitedVertexWithMinWeight ()
35+
36+ def returnPath (self , label : str )-> str :
4837 if self .prev [label ] is None :
4938 return label
5039 else :
51- return self .showPath (self .prev [label ]) + " -> " + label
40+ return self .returnPath (self .prev [label ]) + " -> " + label
41+
42+ def findUnvisitedVertexWithMinWeight (self )-> Vertex :
43+ unvisitedVertex : Vertex = None
44+ for vertex in self .vertices :
45+ if not self .visited [vertex .label ]:
46+ if unvisitedVertex is None :
47+ unvisitedVertex = vertex
48+ elif unvisitedVertex .weight > vertex .weight :
49+ unvisitedVertex = vertex
50+ return unvisitedVertex
51+
5252
5353 def findIndexByLabel (self , label : str )-> int :
5454 found : bool = False
@@ -61,5 +61,8 @@ def findIndexByLabel(self, label: str)->int:
6161 if found :
6262 return count
6363 else :
64- return None
65-
64+ raise Exception ("Can't find vertex with label " + label )
65+
66+
67+
68+
0 commit comments