class FibPQ(PriorityQueue): def __init__(self): self.heap = FibHeap() def __len__(self): return self.heap.count def insert(self, node): self.heap.insert(node) def minimum(self): return self.heap.minimum() def remove_minimum(self): return self.heap.remove_minimum() def decrease_key(self, node, new_priority): self.heap.decrease_key(node, new_priority)
if get_input: print('Finish end', end_point) fib = FibHeap() vis = {} info = {} # store distance / node, used to decrease key nodes = list(set(nodes)) for node in nodes: fib_node = fib.insert(x=float('inf'), vertex=(node, graph[node])) vis[node] = False info[node] = [float('inf'), fib_node] if get_input: print('Finish fib') fib.decrease_key(info[start_point][1], 0) vis[start_point] = True prev = {} # store the previous point # print(info.values()) while False in vis.values(): node_min = fib.extract_min() v = node_min.value[1] # dict object vis[node_min.value[0]] = True for adj_v, w in v.items(): # adj_v: vertex's name, w: weight if vis[adj_v]: continue # print(int(node_min.key) + int(w)) # print(info[adj_v][0]) if node_min.key + int(w) < info[adj_v][0]: fib.decrease_key(info[adj_v][1], node_min.key + int(w))