Bài toán xác định đường đi ngắn nhất

Một phần của tài liệu Xử lý song song áp dụng đối với một số bài toán trong lý thuyết đồ thị (Trang 39 - 43)

Cho đơn đồ thị G = (V, E) lên thông, có trọng số dương,  1, 2,..., n,  1, 2,..., m

Vv v v Ee e e . Mỗi cạnh eij ( ,v vi j) được gán với một trọng số dương Cij xác định như sau:

- Cij nếu ( ,v vi j)E

- Cij0 nếu vivj

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

Yêu cầu: Tìm đường đi ngắn nhất từ một đỉnh nguồn tới các đỉnh còn lại của đồ thị

2.2.2.1 Đường đi ngắn nhất từ một đỉnh nguồn tới các đỉnh Tư tưởng của thuật toánDijkstra:

- Ta xây dựng một tập S các đỉnh mà độ dài đường đi từ gốc tới nó là ngắn nhất. Lúc đầu S chỉ chứa đỉnh gốc giả sử là a, ở mỗi bước ta thêm vào S một trong số các đỉnh còn lại của v mà độ dài từ a đến v là ngắn nhất.

- Dùng mảng Déê2..nùú

ë û, trong đó D ué ùê úë û để ghi độ dài đường đi ngắn nhất hiện

thời từ a tới đỉnh u.

- Ban đầu vì S chỉ chứa a, nên D u é ùê ú = C a, uéê ùú

ë û ë û. Tại mỗi bước ta sẽ chọn đỉnh \

v V S mà D vé ùê ú

ë û là nhỏ nhất và thêm v vào S. Sau khi thêm v vào S ta xác định lại

các D ué ù ê ú

ë ûvới uS. Nếu độ dài đường đi đặc biệt qua đỉnh v (vừa được chọn) mà nhỏ hơn D ué ù

ê ú

ë ûthì ta lấy D ué ù ê ú

ë ûlà độ dài đường đi đó. Khi S = V thì D ué ùê ú

ë ûlưu độ dài ngắn nhất từ 1 đến u. - Sử dụng mảng P 2..néê ùú

ë û trong đó P u é ù =ê úë û vnếu v là đỉnh kề trước của u.

Thuật toán Dijksta

Input: Ma trận trọng số C (dương) của đồ thị với đỉnh gốc là a. Output: Khoảng cách từ gốc a tới các đỉnh của đồ thị

Procedure Dijkstra; Begin S:= {a} ; D[a]:=0; {S: Là tập các đỉnh có độ dài ngắn nhất đến gốc} {D[a]: Là độ dài từ gốc đến đỉnh a} For u (V {a}) do

{u: Các đỉnh còn lại của đồ thị trừ đỉnh gốc} {V: Là tập các đỉnh của đồ thị}

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

D[u]:= C[a,u] ;

{D[u]: Mảng lưu độ dài ngắn nhất từ gốc tới u} {C[a,u]: Giá trị trọng số thực từ a đến u} P[u]:= a ;

{P[u]: Là ma trận lưu vết đường đi} End ;

While V S\  do Begin

Chọn đỉnh v trong V\S mà D[v] nhỏ nhất; S:= S {v} ; {thêm v vào S}

For mỗi đỉnh u trong V\S do

If D[v] + C[v,u] < D[u] then Begin D[u]:= D[v] + C[v,u]; P[u]:= v ; End; End ; End ;

2.2.2.2 Thuật toán Folyd

Để tìm đường đi ngắn nhất giữa mọi cặp đỉnh ta có thể sử dụng thuật toán Dijkstra với các đỉnh được chọn làm nguồn lần lượt là 1, 2, …, n. Ngoài ra còn có cách trực tiếp giải quyết vấn đề trên, đó là thuật toán Floyd.

Tƣ tƣởng của thuật toán:

- Nếu đỉnh k nằm trên đường đi ngắn nhất từ đỉnh i tới j thì đoạn đường từ i tới

k và từ k tới j phải là đường đi ngắn nhất từ i tới k và từ k tới j tương ứng.

- Do đó sử dụng ma trận A để lưu độ dài đường đi ngắn nhất giữa mọi cặp đỉnh. - Ban đầu ta đặt A i, jé ùê ú= C i, jé ùê ú

ë û ë û, tức là ban đầu A chứa độ dài đường đi trực tiếp (không đi qua các đỉnh nào cả).

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

- Sau đó thực hiện n lần lặp, sau lần lặp thứ k ma trận A sẽ chứa độ dài đường đi ngắn nhất giữa mọi cặp đỉnh chỉ qua các đỉnh thuộc tập {1, 2, ¼, k}. Như vậy, sau n lần lặp ta nhận được ma trận A chứa độ dài các đường đi ngắn nhất giữa mọi cặp đỉnh của đồ thị.

- Ký hiệu Aklà ma trận A sau lần lặp thứ k, tức là A i, jk é ùê ú

ë ûlà độ dài đường đi ngắn nhất từ i đến j chỉ qua các đỉnh thuộc {1, 2,¼, k}. A i, jk é ùê ú

ë ûđược tính theo công thức như sau:

{ }

k k 1 k 1 k 1

A i, j ê úé ù = Min A - é ùê úi, j , A- é ùê úi, k + A - é ùê úk, j

ë û ë û ë û ë û

- Trong quá trình lặp ta phải lưu lại vết đường đi tức là các đường đi ngắn nhất đi qua các đỉnh nào. Khi đó ta sẽ sử dụng mảng phụ P n n[  ], trong đó P i, jé ùê ú

ë ûlưu đỉnh k nếu đường đi ngắn nhất từ i tới j qua đỉnh k. Ban đầu p i, jé ù=ê úë û 0với mọi i, j, vì lúc đó đường đi ngắn nhất là đường đi trực tiếp, không qua các đỉnh nào cả.

Với các phần tử như trên ta thấy ở bước lặp thứ k thì giá trị của ma trận A ở dòng thứ k và cột thứ k là không thay đổi.

Thuật toán: Procedure Floyd; Var i, j, k: integer; Begin For i:=1 to n do For j:=1 to n do Begin A[i,j]:= C[i,j]; P[i,j]:= 0; End; For k:= 1 to n do For i:=1 to n do For j:=1 to n do

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn

If A[i,k] + A[k,j] < A[i,j] then

Begin

A[i,j]:= A[i,k] + A[k,j];

P[i,j]:= k;

End;

End;

Dễ thấy rằng độ phức tạp của thuật toán là 3

( )

O n

Một phần của tài liệu Xử lý song song áp dụng đối với một số bài toán trong lý thuyết đồ thị (Trang 39 - 43)

Tải bản đầy đủ (PDF)

(69 trang)