|
@ -0,0 +1,82 @@ |
|
|
|
|
|
# Python program for Dijkstra's single |
|
|
|
|
|
# source shortest path algorithm. The program is |
|
|
|
|
|
# for adjacency matrix representation of the graph |
|
|
|
|
|
|
|
|
|
|
|
# Library for INT_MAX |
|
|
|
|
|
import sys |
|
|
|
|
|
|
|
|
|
|
|
class Graph(): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, vertices): |
|
|
|
|
|
self.V = vertices |
|
|
|
|
|
self.graph = [[0 for column in range(vertices)] |
|
|
|
|
|
for row in range(vertices)] |
|
|
|
|
|
|
|
|
|
|
|
def printSolution(self, dist): |
|
|
|
|
|
print "Vertex tDistance from Source" |
|
|
|
|
|
for node in range(self.V): |
|
|
|
|
|
print node, "t", dist[node] |
|
|
|
|
|
|
|
|
|
|
|
# A utility function to find the vertex with |
|
|
|
|
|
# minimum distance value, from the set of vertices |
|
|
|
|
|
# not yet included in shortest path tree |
|
|
|
|
|
def minDistance(self, dist, sptSet): |
|
|
|
|
|
|
|
|
|
|
|
# Initilaize minimum distance for next node |
|
|
|
|
|
min = sys.maxint |
|
|
|
|
|
|
|
|
|
|
|
# Search not nearest vertex not in the |
|
|
|
|
|
# shortest path tree |
|
|
|
|
|
for v in range(self.V): |
|
|
|
|
|
if dist[v] < min and sptSet[v] == False: |
|
|
|
|
|
min = dist[v] |
|
|
|
|
|
min_index = v |
|
|
|
|
|
|
|
|
|
|
|
return min_index |
|
|
|
|
|
|
|
|
|
|
|
# Funtion that implements Dijkstra's single source |
|
|
|
|
|
# shortest path algorithm for a graph represented |
|
|
|
|
|
# using adjacency matrix representation |
|
|
|
|
|
def dijkstra(self, src): |
|
|
|
|
|
|
|
|
|
|
|
dist = [sys.maxint] * self.V |
|
|
|
|
|
dist[src] = 0 |
|
|
|
|
|
sptSet = [False] * self.V |
|
|
|
|
|
|
|
|
|
|
|
for cout in range(self.V): |
|
|
|
|
|
|
|
|
|
|
|
# Pick the minimum distance vertex from |
|
|
|
|
|
# the set of vertices not yet processed. |
|
|
|
|
|
# u is always equal to src in first iteration |
|
|
|
|
|
u = self.minDistance(dist, sptSet) |
|
|
|
|
|
|
|
|
|
|
|
# Put the minimum distance vertex in the |
|
|
|
|
|
# shotest path tree |
|
|
|
|
|
sptSet[u] = True |
|
|
|
|
|
|
|
|
|
|
|
# Update dist value of the adjacent vertices |
|
|
|
|
|
# of the picked vertex only if the current |
|
|
|
|
|
# distance is greater than new distance and |
|
|
|
|
|
# the vertex in not in the shotest path tree |
|
|
|
|
|
for v in range(self.V): |
|
|
|
|
|
if self.graph[u][v] > 0 and sptSet[v] == False and \ |
|
|
|
|
|
dist[v] > dist[u] + self.graph[u][v]: |
|
|
|
|
|
dist[v] = dist[u] + self.graph[u][v] |
|
|
|
|
|
|
|
|
|
|
|
self.printSolution(dist) |
|
|
|
|
|
|
|
|
|
|
|
# Driver program |
|
|
|
|
|
g = Graph(9) |
|
|
|
|
|
g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0], |
|
|
|
|
|
[4, 0, 8, 0, 0, 0, 0, 11, 0], |
|
|
|
|
|
[0, 8, 0, 7, 0, 4, 0, 0, 2], |
|
|
|
|
|
[0, 0, 7, 0, 9, 14, 0, 0, 0], |
|
|
|
|
|
[0, 0, 0, 9, 0, 10, 0, 0, 0], |
|
|
|
|
|
[0, 0, 4, 14, 10, 0, 2, 0, 0], |
|
|
|
|
|
[0, 0, 0, 0, 0, 2, 0, 1, 6], |
|
|
|
|
|
[8, 11, 0, 0, 0, 0, 1, 0, 7], |
|
|
|
|
|
[0, 0, 2, 0, 0, 0, 6, 7, 0] |
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
g.dijkstra(0); |
|
|
|
|
|
|