Ở mục 1.4.2 chúng ta đã đưa ra sơ đồ thuật toán Dijkstra nguyên thủy với độ phức tạp O(n2) đó là:
procedure dijkstra;
// input: Đồ thị G, các biến toàn cục s, t; // ouput: Khoảng cách từ s đến t; begin Repeat u := FindMin(); if u = t then exit; Đánh dấu u đã cố định;
Repair(u); // tiến hành sửa nhãn cho các đỉnh kề u Until False;
Bây giờ chúng ta sẽ tổ chức mảng nhãn d theo cấu trúc Fibonacci heap, khi đó mô hình thuật toán Dijkstra có thể viết lại như sau:
procedure dijkstra_fibo_heap;
// input: Đồ thị G, đống H. S, t là các biến toàn cục. // output: Khoảng cách từ s đến t.
begin Repeat
P := FIB_HEAP_EXTRACT_MIN(H);
u := p^. u; // u là một trường mới của các nút trong Fibonacci heap để lưu nhãn //của đinh (tên đỉnh) mà nút đại diện.
if u = t then exit; Đánh dấu u đã cố định ; for (v thuộc ke(u)) do
if (d[v] > d[u] + c[u,v] ) then begin d[v] := d[u] + c[u,v]; FIB_HEAP_DECREASE_KEY(H, ptr[v], d[v]) ;// ptr[v] là nút trong //H có nhãn là v. end; Until false; end;
Vòng lặp Repeat thực hiện lặp tối đa là n lần, thao tác FIB_HEAP_ EXTRACT_MIN(H) trích nút cực tiểu có độ phức tạp là O(logn), vì thế tính
trong toàn bộ vòng repeat thì tổng số thao tác này có độ phức tạp là O(nlogn). Thao tác FIB_HEAP_DECREASE_KEY(H, ptr[ v], d[v]) có độ phức
tạp là O(1), số lần lặp trong một vòng for chỉ bằng số lượng đỉnh kề u, vì vậy nếu chúng ta sử dụng danh sách liên kết để tổ chức các cạnh thì độ phức tạp của tất cả các vòng lặp for trong vòng lặp repeat sẽ là O(m).
Từ hai nhận xét trên suy ra thuật toán Dijkstra Fibonacci heap có độ phức tạp là cỡ O(nlogn +m), với m là số cạnh của đồ thị. Với những đồ thị
thưa thì đây sẽ là một thuật toán rất tốt.