Renamed file dijkstra

pull/980/head
Cristian Bastidas 2022-10-08 15:14:36 -05:00
parent 53267f12ed
commit fe7fb12a78
3 changed files with 1 additions and 110 deletions

View File

@ -77,6 +77,7 @@
- [Simple Graph](graphs/graph.py) - [Simple Graph](graphs/graph.py)
- [BFS SEQUENCE](graphs/bfs-sequence.py) - [BFS SEQUENCE](graphs/bfs-sequence.py)
- [Depth First Search](graphs/depth-first-search.py) - [Depth First Search](graphs/depth-first-search.py)
- [Dijkstra's Algorithm](graphs/dijkstra.py)
## Trees ## Trees
- [Binary Tree](trees/binary_tree.py) - [Binary Tree](trees/binary_tree.py)

View File

@ -1,110 +0,0 @@
# A Dijkstra's algorithm implementation in Python
# using adjacency matrix
from math import inf
wmat = [[0, 2, 0, 0, 0, 1, 0, 0],
[2, 0, 2, 2, 4, 0, 0, 0],
[0, 2, 0, 0, 3, 0, 0, 1],
[0, 2, 0, 0, 4, 3, 0, 0],
[0, 4, 3, 4, 0, 0, 7, 0],
[1, 0, 0, 3, 0, 0, 5, 0],
[0, 0, 0, 0, 7, 5, 0, 6],
[0, 0, 1, 0, 0, 0, 6, 0]]
def find_all(wmat, start, end=-1):
"""
Returns a tuple with a distances' list and paths' list of
all remaining vertices with the same indexing.
(distances, paths)
For example, distances[x] are the shortest distances from x
vertex which shortest path is paths[x]. x is an element of
{0, 1, ..., n-1} where n is the number of vertices
Args:
wmat -- weighted graph's adjacency matrix
start -- paths' first vertex
end -- (optional) path's end vertex. Return just the
distance and its path
Exceptions:
Index out of range, Be careful with start and end vertices
"""
n = len(wmat)
dist = [inf]*n
dist[start] = wmat[start][start] # 0
spVertex = [False]*n
parent = [-1]*n
path = [{}]*n
for count in range(n-1):
minix = inf
u = 0
for v in range(len(spVertex)):
if spVertex[v] == False and dist[v] <= minix:
minix = dist[v]
u = v
spVertex[u] = True
for v in range(n):
if not(spVertex[v]) and wmat[u][v] != 0 and dist[u] + wmat[u][v] < dist[v]:
parent[v] = u
dist[v] = dist[u] + wmat[u][v]
for i in range(n):
j = i
s = []
while parent[j] != -1:
s.append(j)
j = parent[j]
s.append(start)
path[i] = s[::-1]
return (dist[end], path[end]) if end >= 0 else (dist, path)
def find_shortest_path(wmat, start, end=-1):
"""
Returns paths' list of all remaining vertices.
Args:
wmat -- weigthted graph's adjacency matrix
start -- paths' first vertex
end -- (optional) path's end vertex. Return just
the path
Exceptions:
Index out of range, Be careful with start and end vertices.
"""
return find_all(wmat, start, end)[1]
def find_shortest_distance(wmat, start, end=-1):
"""
Returns distances' list of all remaining vertices.
Args:
wmat -- weigthted graph's adjacency matrix
start -- paths' first vertex
end -- (optional) path's end vertex. Return just
the distance
Exceptions:
Index out of range, Be careful with start and end vertices.
"""
return find_all(wmat, start, end)[0]
if __name__ == "__main__":
i = 0
for D, P in zip(*find_all(wmat, 0)):
print("Target: {}, Distance: {}, Path: {}".format(i, D, P))
i += 1
print("\nshortest path to last node", find_shortest_path(wmat, 0, 7))
print("shortest distance to last node", find_shortest_distance(wmat, 0, 7))