Source code for algorithms.graphs.AStar
import math
import queue
import sys
[docs]class AStar:
def __init__(self, n, adj, cost, x, y):
self.n = n
self.adj = adj
self.cost = cost
self.inf = n * 10 ** 6
self.d = [self.inf] * n
self.visited = [False] * n
self.workset = []
self.x = x
self.y = y
[docs] def clear(self):
for v in self.workset:
self.d[v] = self.inf
self.visited[v] = False
del self.workset[0:len(self.workset)]
[docs] def visit(self, q, v, dist, measure):
if self.d[v] > dist:
self.d[v] = dist
q.put((dist + measure, v))
self.workset.append(v)
[docs] def potential(self, v, t):
return math.sqrt((self.x[v] - self.x[t]) ** 2 + (self.y[v] - self.y[t]) ** 2)
[docs] def query(self, s, t):
self.clear()
q = queue.PriorityQueue()
self.visit(q, s, 0, self.potential(s, t))
while not q.empty():
v = q.get()[1]
if v == t:
return self.d[t]
if self.visited[v]:
continue
for x in range(len(self.adj[v])):
dist = self.d[v] + self.cost[v][x]
poten = self.potential(adj[v][x], t)
self.visit(q, adj[v][x], dist, poten)
self.visited[v] = True
return -1
[docs]def readl():
return map(int, sys.stdin.readline().split())
if __name__ == '__main__':
n, m = readl()
x = [0 for _ in range(n)]
y = [0 for _ in range(n)]
adj = [[] for _ in range(n)]
cost = [[] for _ in range(n)]
for i in range(n):
a, b = readl()
x[i] = a
y[i] = b
for e in range(m):
u, v, c = readl()
adj[u - 1].append(v - 1)
cost[u - 1].append(c)
t, = readl()
astar = AStar(n, adj, cost, x, y)
for i in range(t):
s, t = readl()
print(astar.query(s - 1, t - 1))