1- from vertex import Vertex
2-
3- class Graph :
4- def __init__ (self , size : int = 10 ):
5- self .vertices : list = []
6- self .prev : dict = {}
7- self .adjacencyMatrix : list = [[None for x in range (size )] for y in range (size )]
8- self .visited : dict = {}
9-
10- def addVertex (self , label : str ):
11- vertex : Vertex = Vertex (label , float ("inf" ), len (self .vertices ))
12- self .vertices .append (vertex )
13- self .prev [label ] = None
14- self .visited [label ] = False
15-
16- def addEdge (self , label1 : str , label2 : str , weight : int ):
17- index1 : int = self .findIndexByLabel (label1 )
18- index2 : int = self .findIndexByLabel (label2 )
19- self .adjacencyMatrix [index1 ][index2 ] = weight
20-
21- def dijkstra (self , label : str ):
22- index : int = self .findIndexByLabel (label )
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 :
37- if self .prev [label ] is None :
38- return label
39- else :
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-
52-
53- def findIndexByLabel (self , label : str )-> int :
54- found : bool = False
55- count : int = 0
56- while count < len (self .vertices ) and not found :
57- if self .vertices [count ].label == label :
58- found = True
59- else :
60- count += 1
61- if found :
62- return count
63- else :
64- raise Exception ("Can't find vertex with label " + label )
65-
66-
67-
68-
1+ from vertex import Vertex
2+
3+ class Graph :
4+ def __init__ (self ):
5+ self .__vertices__ : dict = {}
6+ self .__prev__ : dict = {}
7+ self .__adjacency_map__ : dict = {}
8+ self .__visited__ : dict = {}
9+
10+ def add_vertex (self , label : str ):
11+ self .__vertices__ [label ] = Vertex (label )
12+ self .__prev__ [label ] = None
13+ self .__adjacency_map__ [label ]: dict = {}
14+
15+ def add_edge (self , label1 : str , label2 : str , weight : int = float ("inf" )):
16+ self .__adjacency_map__ [label1 ][label2 ] = Vertex (label2 , weight )
17+
18+ def dijkstra (self , label : str ):
19+ current : Vertex = self .__vertices__ [label ]
20+ current .weight = 0
21+ while current is not None :
22+ for neighbour_label in self .__adjacency_map__ [current .label ]:
23+ neighbour : Vertex = self .__adjacency_map__ [current .label ][neighbour_label ]
24+ vertex : Vertex = self .__vertices__ [neighbour_label ]
25+ if current .weight + neighbour .weight < vertex .weight :
26+ self .__prev__ [vertex .label ] = current .label
27+ vertex .weight = current .weight + neighbour .weight
28+ self .__visited__ [current .label ] = current .label
29+ current = self .__find_vertex__ ()
30+
31+ def __find_vertex__ (self ):
32+ vertex : Vertex = None
33+ for label in self .__vertices__ :
34+ if label not in self .__visited__ :
35+ if vertex is None :
36+ vertex = self .__vertices__ [label ]
37+ else :
38+ tmp : Vertex = self .__vertices__ [label ]
39+ if tmp .weight < vertex .weight :
40+ veretx = tmp
41+ return vertex
42+
43+ def return_path (self , label : str ) -> str :
44+ if self .__prev__ [label ] is None :
45+ return label
46+ else :
47+ return self .return_path (self .__prev__ [label ]) + " -> " + label
48+
49+
50+
51+
52+
53+
54+
55+
0 commit comments