-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathDijkstraShortestReach.py
101 lines (94 loc) · 3.07 KB
/
DijkstraShortestReach.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import sys
from collections import defaultdict
class Graph:
def __init__(self,n):
self.vert = n
#self.graph = defaultdict(list)
self.graph = [[0 for column in range(n)]
for row in range(n)]
self.pathlist = defaultdict(list)
def insertedge(self,a,b,dist):
a = int(a)
b = int(b)
#print("bhavin")
#self.graph[a].append(b)
#print(adjmatrix)
#a,b = input().split()
#print(a,b)
if(self.graph[a-1][b-1] != 0):
temp = self.graph[a-1][b-1]
if(temp > dist):
self.graph[a-1][b-1] = dist
else:
self.graph[a-1][b-1] = dist
if(self.graph[b-1][a-1] != 0):
temp = self.graph[b-1][a-1]
if(temp > dist):
self.graph[b-1][a-1] = dist
else:
self.graph[b-1][a-1] = dist
#self.printgraph()
def printgraph(self):
print(self.graph)
def printshortestgraph(self, dist,src):
f = open('somefile.txt', 'a')
#print("Vertex tDistance from Source")
for node in range(self.vert):
if(node == src):
continue
if(node == self.vert - 1):
if(dist[node] != sys.maxsize):
print(dist[node],file = f)
else:
print(-1,file = f)
elif(dist[node] != sys.maxsize):
#print("From 0 to ", node ," - >",dist[node],end = " ")
#print(self.pathlist[node])
print(dist[node],end = ' ',file = f)
#f.write(dist[node] + " ")
elif(dist[node] == sys.maxsize):
#print("From 0 to ", node ," - >",-1,end = " ")
print(-1,end = ' ',file = f)
#f.write(-1 + " ")
#print('\n')
#f.write("\n")
def findmindist(self,dist,sptSet):
#print(dist)
minval = sys.maxsize
#print(minval)
#min_index = 225
for v in range(self.vert):
if dist[v] <= minval and sptSet[v] == False:
minval = dist[v]
min_index = v
#print("assign",v)
return min_index
def dijkstra(self, src):
dist = [sys.maxsize] * self.vert
src = src - 1
dist[src] = 0
self.pathlist[0].append(src)
sptSet = [False] * self.vert
for cout in range(self.vert):
u = self.findmindist(dist, sptSet)
#if u == 225 :
# break
sptSet[u] = True
for v in range(self.vert):
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.pathlist[v] = self.pathlist[u] + [v]
#print(dist,"Changing")
#print("bhavin")
self.printshortestgraph(dist,src)
t = int(input().strip())
for a0 in range(t):
n,m = input().strip().split(' ')
n,m = [int(n),int(m)]
gr = Graph(n)
for a1 in range(m):
x,y,r = input().strip().split(' ')
x,y,r = [int(x),int(y),int(r)]
gr.insertedge(x,y,r)
s = int(input().strip())
gr.dijkstra(s)