Skip to content

Instantly share code, notes, and snippets.

@godsapple
Created June 7, 2019 05:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save godsapple/2396eb3818c87eb27a524d635342d949 to your computer and use it in GitHub Desktop.
Save godsapple/2396eb3818c87eb27a524d635342d949 to your computer and use it in GitHub Desktop.
import heapq
import sys
import math
sys.setrecursionlimit(10000)
INF = 999999999
class Point:
def __init__(self, x, y):
self.x = float(x)
self.y = float(y)
def getCost(p,c):
x_dis = abs(p.x - c.x)
y_dis = abs(p.y - c.y)
cost = math.sqrt(x_dis * x_dis + y_dis * y_dis)
return cost
def dijkstra(G, start, endp):
dis = dict((point, INF) for point in G)
dis[start] = 0.00
vis = dict((point, False) for point in G)
# heap
pq = []
heapq.heappush(pq, [dis[start], start])
path = dict((point, [start]) for point in G)
while len(pq) > 0:
v_dis, v = heapq.heappop(pq)
if vis[v] == True:
continue
vis[v] = True
p = path[v].copy()
for point in G:
distance = getCost(v,point)
if distance > 100.00:
continue
new_dis = dis[v] + distance
if new_dis < dis[point] and (not vis[point]):
dis[point] = new_dis
heapq.heappush(pq, [dis[point], point])
temp = p.copy()
temp.append(point)
path[point] = temp
distance = dis[endp]
if distance == INF:
print("-1")
else:
print("{:.2f}".format(distance))
while True:
try:
numbers = input().strip().split(",")
limit = int(numbers[0])
point_list = []
numbers = list(map(float, numbers))
stap = Point(numbers[1],numbers[2])
endp = Point(numbers[-2],numbers[-1])
if stap.x>limit or stap.y>limit or stap.x<0 or stap.y<0 :
print("-1")
elif endp.x>limit or endp.y>limit or endp.x<0 or endp.y<0 :
print("-1")
else:
for i in range(1, len(numbers), 2):
if numbers[i]<=limit and numbers[i+1]<=limit:
point_list.append(Point(numbers[i], numbers[i+1]))
dijkstra(point_list, point_list[0], point_list[-1])
except EOFError:
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment