mirror of
https://github.com/iritmaximus/tira.git
synced 2026-10-12 19:13:47 +03:00
54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
import time
|
|
import random
|
|
import heapq
|
|
|
|
|
|
class Dijkstra:
|
|
def __init__(self, nodes):
|
|
self.nodes = nodes
|
|
self.graph = {node: [] for node in nodes}
|
|
|
|
def add_edge(self, node_a, node_b, weight):
|
|
self.graph[node_a].append((node_b, weight))
|
|
|
|
def find_distances(self, start_node):
|
|
distances = {}
|
|
for node in self.nodes:
|
|
distances[node] = float("inf")
|
|
distances[start_node] = 0
|
|
|
|
queue = []
|
|
heapq.heappush(queue, (0, start_node))
|
|
|
|
visited = set()
|
|
while queue:
|
|
node_a = heapq.heappop(queue)[1]
|
|
if node_a in visited:
|
|
continue
|
|
visited.add(node_a)
|
|
|
|
for node_b, weight in self.graph[node_a]:
|
|
new_distance = distances[node_a] + weight
|
|
if new_distance < distances[node_b]:
|
|
distances[node_b] = new_distance
|
|
new_pair = (new_distance, node_b)
|
|
heapq.heappush(queue, new_pair)
|
|
|
|
return distances
|
|
|
|
|
|
if __name__ == "__main__":
|
|
start = time.time()
|
|
ls = [x for x in range(1, 5000 + 1)]
|
|
random.shuffle(ls)
|
|
d = Dijkstra(ls)
|
|
for i in range(1, 5000 + 1):
|
|
for j in range(1, i):
|
|
if i - j < 10:
|
|
d.add_edge(j, i, random.randint(1, 1000))
|
|
|
|
distances = d.find_distances(1)
|
|
end = time.time()
|
|
|
|
print(f"Time: {end - start:.2f}s")
|