Make-Fibonacci-Heap()
n[H]
:= 0
min[H] := NIL
return H
Fibonacci-Heap-Minimum(H)
return min[H]
Fibonacci-Heap-Link(H,y,x)
remove y from
the root list of H
make y a
child of x
degree[x]
:= degree[x] + 1
mark[y]
:= FALSE
CONSOLIDATE(H)
for i:=0
to D(n[H])
Do A[i] := NIL
for each node w
in the root list of H
do x:= w
d:= degree[x]
while A[d] <>
NIL
do y:=A[d]
if key[x]>key[y]
then exchange x<->y
Fibonacci-Heap-Link(H, y, x)
A[d]:=NIL
d:=d+1
A[d]:=x
min[H]:=NIL
for i:=0
to D(n[H])
do if A[i]<>
NIL
then add A[i] to the
root list of H
if min[H] = NIL or
key[A[i]]<key[min[H]]
then min[H]:=
A[i]
Fibonacci-Heap-Union(H1,H2)
H :=
Make-Fibonacci-Heap()
min[H]
:= min[H1]
Concatenate
the root list of H2 with the root list of H
if (min[H1]
= NIL) or (min[H2] <> NIL and min[H2] < min[H1])
then min[H] := min[H2]
n[H]
:= n[H1] + n[H2]
free the
objects H1 and H2
return H
Fibonacci-Heap-Insert(H,x)
degree[x]
:= 0
p[x]
:= NIL
child[x]
:= NIL
right[x]
:= x
mark[x]
:= FALSE
concatenate
the root list containing x with root list H
if min[H]
= NIL or key[x]<key[min[H]]
then min[H] := x
n[H]:=
n[H]+1
Fibonacci-Heap-Extract-Min(H)
z:= min[H]
if x
<> NIL
then for each child x of z
do add x to the root list of H
p[x]:= NIL
remove z from the root list of H
if z = right[z]
then min[H]:=NIL
else min[H]:=right[z]
CONSOLIDATE(H)
n[H] := n[H]-1
return z
Fibonacci-Heap-Decrease-Key(H,x,k)
if k
> key[x]
then error "new key is greater than current key"
key[x]
:= k
y := p[x]
if y
<> NIL and key[x]<key[y]
then
CUT(H, x, y)
CASCADING-CUT(H,y)
if key[x]<key[min[H]]
then
min[H] := x
CUT(H,x,y)
Remove x
from the child list of y, decrementing degree[y]
Add x
to the root list of H
p[x]:=
NIL
mark[x]:=
FALSE
CASCADING-CUT(H,y)
z:= p[y]
if z
<> NIL
then if mark[y]
= FALSE
then mark[y]:=
TRUE
else CUT(H, y, z)
CASCADING-CUT(H, z)
Fibonacci-Heap-Delete(H,x)
Fibonacci-Heap-Decrease-Key(H,x,-infinity)
Fibonacci-Heap-Extract-Min(H)
No comments:
Post a Comment