-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdijkstra.py
58 lines (46 loc) · 1.58 KB
/
dijkstra.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# coding: utf-8
#!/bin/python
class Graph:
def __init__(self, G, start, end):
self.G = G
self.start = start
self.end = end
self.D = {} # distancia
self.P = {} # precendetes
self.S = {}
for i in self.G:
self.D[i] = float("inf")
self.P[i] = -1
self.S[i] = False
self.D[self.start] = 0
self.P[self.start] = -1
self.V = self.start
def dijkstra(self):
while self.S[self.end] == False:
neighbors_of_vertex = self.G[self.V].copy()
for neighbor in self.G[self.V]:
if self.S[neighbor]:
neighbors_of_vertex.pop(neighbor)
if not neighbors_of_vertex == {}:
for v, d in neighbors_of_vertex.iteritems():
if self.D[self.V] + d < self.D[v]:
self.D[v] = self.D[self.V] + d
distance, vertex = min([ (d,v) for v, d in neighbors_of_vertex.iteritems() ])
self.P[vertex] = self.V
self.S[self.V] = True
self.V = vertex
return self.P, self.D
def shortest_path(self):
distance = 0
path = [self.end]
back = self.end
while back != self.start:
back = self.P[back]
path.append(back)
path.reverse()
return path
def shortest_path_distance(self):
distances = []
for vertex in self.shortest_path():
distances.append(self.D[vertex])
return distances