Esempio n. 1
0
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)
Esempio n. 2
0
    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))