Skip to content

Commit 2d46471

Browse files
Merge pull request matthewsamuel95#109 from virendrasingal/master
Create Dadjacencylist.py
2 parents f60f985 + 878cae1 commit 2d46471

File tree

1 file changed

+190
-0
lines changed

1 file changed

+190
-0
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# Python program for Dijkstra's shortest path algorithm for adjacency list representation of graph
2+
3+
from collections import defaultdict
4+
import sys
5+
6+
class Heap():
7+
8+
def __init__(self):
9+
self.array = []
10+
self.size = 0
11+
self.pos = []
12+
13+
def newMinHeapNode(self, v, dist):
14+
minHeapNode = [v, dist]
15+
return minHeapNode
16+
17+
# A utility function to swap two nodes
18+
# of min heap. Needed for min heapify
19+
def swapMinHeapNode(self,a, b):
20+
t = self.array[a]
21+
self.array[a] = self.array[b]
22+
self.array[b] = t
23+
24+
25+
def minHeapify(self, idx):
26+
smallest = idx
27+
left = 2*idx + 1
28+
right = 2*idx + 2
29+
30+
if left < self.size and self.array[left][1] \
31+
< self.array[smallest][1]:
32+
smallest = left
33+
34+
if right < self.size and self.array[right][1]\
35+
< self.array[smallest][1]:
36+
smallest = right
37+
38+
39+
if smallest != idx:
40+
41+
# Swap positions
42+
self.pos[ self.array[smallest][0] ] = idx
43+
self.pos[ self.array[idx][0] ] = smallest
44+
45+
46+
self.swapMinHeapNode(smallest, idx)
47+
48+
self.minHeapify(smallest)
49+
50+
51+
def extractMin(self):
52+
53+
54+
if self.isEmpty() == True:
55+
return
56+
57+
58+
root = self.array[0]
59+
60+
61+
lastNode = self.array[self.size - 1]
62+
self.array[0] = lastNode
63+
64+
65+
self.pos[lastNode[0]] = 0
66+
self.pos[root[0]] = self.size - 1
67+
68+
69+
self.size -= 1
70+
self.minHeapify(0)
71+
72+
return root
73+
74+
def isEmpty(self):
75+
return True if self.size == 0 else False
76+
77+
def decreaseKey(self, v, dist):
78+
79+
# Get the index of v in heap array
80+
81+
i = self.pos[v]
82+
83+
84+
self.array[i][1] = dist
85+
86+
87+
while i > 0 and self.array[i][1] < self.array[(i - 1) / 2][1]:
88+
89+
# Swap this node with its parent
90+
self.pos[ self.array[i][0] ] = (i-1)/2
91+
self.pos[ self.array[(i-1)/2][0] ] = i
92+
self.swapMinHeapNode(i, (i - 1)/2 )
93+
94+
# move to parent index
95+
i = (i - 1) / 2;
96+
97+
# A utility function to check if a given
98+
# vertex 'v' is in min heap or not
99+
def isInMinHeap(self, v):
100+
101+
if self.pos[v] < self.size:
102+
return True
103+
return False
104+
105+
106+
def printArr(dist, n):
107+
print "Vertex\tDistance from source"
108+
for i in range(n):
109+
print "%d\t\t%d" % (i,dist[i])
110+
111+
112+
class Graph():
113+
114+
def __init__(self, V):
115+
self.V = V
116+
self.graph = defaultdict(list)
117+
118+
119+
def addEdge(self, src, dest, weight):
120+
121+
122+
newNode = [dest, weight]
123+
self.graph[src].insert(0, newNode)
124+
125+
126+
newNode = [src, weight]
127+
self.graph[dest].insert(0, newNode)
128+
129+
130+
def dijkstra(self, src):
131+
132+
V = self.V # Get the number of vertices in graph
133+
dist = [] # dist values used to pick minimum
134+
# weight edge in cut
135+
136+
minHeap = Heap()
137+
138+
for v in range(V):
139+
dist.append(sys.maxint)
140+
minHeap.array.append( minHeap.newMinHeapNode(v, dist[v]) )
141+
minHeap.pos.append(v)
142+
143+
144+
minHeap.pos[src] = src
145+
dist[src] = 0
146+
minHeap.decreaseKey(src, dist[src])
147+
148+
149+
minHeap.size = V;
150+
151+
152+
while minHeap.isEmpty() == False:
153+
154+
155+
newHeapNode = minHeap.extractMin()
156+
u = newHeapNode[0]
157+
158+
159+
for pCrawl in self.graph[u]:
160+
161+
v = pCrawl[0]
162+
163+
164+
if minHeap.isInMinHeap(v) and dist[u] != sys.maxint and \
165+
pCrawl[1] + dist[u] < dist[v]:
166+
dist[v] = pCrawl[1] + dist[u]
167+
168+
169+
minHeap.decreaseKey(v, dist[v])
170+
171+
printArr(dist,V)
172+
173+
174+
# Driver program to test the above functions
175+
graph = Graph(9)
176+
graph.addEdge(0, 1, 4)
177+
graph.addEdge(0, 7, 8)
178+
graph.addEdge(1, 2, 8)
179+
graph.addEdge(1, 7, 11)
180+
graph.addEdge(2, 3, 7)
181+
graph.addEdge(2, 8, 2)
182+
graph.addEdge(2, 5, 4)
183+
graph.addEdge(3, 4, 9)
184+
graph.addEdge(3, 5, 14)
185+
graph.addEdge(4, 5, 10)
186+
graph.addEdge(5, 6, 2)
187+
graph.addEdge(6, 7, 1)
188+
graph.addEdge(6, 8, 6)
189+
graph.addEdge(7, 8, 7)
190+
graph.dijkstra(0)

0 commit comments

Comments
 (0)