Thuật toỏn Dijkstra Tỡm đƣờng đi ngắn nhất trong đồ thị cú trọng số

Một phần của tài liệu thiết kế thuật toán dựa trên ý tưởng của phương pháp tham lam (Trang 33 - 38)

2.3.1. Phỏt biểu bài toỏn

Cho G = (V, E) là đơn đồ thị liờn thụng (vụ hƣớng hoặc cú hƣớng) cú trọng

số, V = {1,.., n} là tập cỏc đỉnh , E là tập cỏc cạnh (cung).

Cho s0 ∈ E. Tỡm đƣờng đi ngắn nhất đi từ s0 đến cỏc đỉnh cũn lại. Giải bài toỏn trờn bằng thuật toỏn Dijkstra .

2.3.2. Phõn tớch thiết kế thuật toỏn

2.3.2.1. í tƣởng thuật toỏn Dijkstra

Thuật toỏn Dijkstra cho phộp tỡm đƣờng đi ngắn nhất từ một đỉnh s đến cỏc đỉnh cũn lại của đồ thị và chiều dài (trọng số ) tƣơng ứng.

Phƣơng phỏp của thuật toỏn là xỏc định tuần tự đỉnh cú chiều dài đến s theo thứ tự tăng dần.

Thuật toỏn đƣợc xõy dựng trờn cơ sở gỏn cho mỗi đỉnh cỏc nhón tạm thời. Nhón tạm thời của cỏc đỉnh cho biết cận trờn của chiều dài đƣờng đi ngắn nhất từ s đến đỉnh đú. Nhón của cỏc đỉnh sẽ biến đổi trong cỏc bƣớc lặp, mà ở mỗi bƣớc lặp sẽ cú một nhón tạm thời trở thành chớnh thức. Nếu nhón của một đỉnh nào đú trở thành chớnh thức thỡ đú cũng chớnh là chiều dài ngắn nhất của đƣờng đi từ s đến đỉnh đú.

2.3.2.2. Mụ tả thuật toỏn

Ký hiệu :

* L(v) để chỉ nhón của đỉnh v, tức là cận trờn của chiều dài đƣờng đi ngắn nhất từ s0 đến v.

* d(s0 ,v) : chiều dài đƣờng đi ngắn nhất từ s0 đến v. * m(s0 ,v) là trọng số của cung (cạnh) (s0,v).

Thuật toỏn Dijkstra tỡm chiều dài đƣờng đi ngắn nhất từ đỉnh s đến n-1 đỉnh cũn lại đƣợc mụ tả nhƣ sau :

input : G, s0 // Đồ thị G, đỉnh xuất phỏt

Mụ tả : • Khởi động : L(v) = ∞ , ∀v ≠ s0; //Nhón tạm thời S = ∅;//Tập lƣu trữ cỏc đỉnh cú nhón chớnh thức • Bƣớc 0 : d(s0 ,s0 ) = L(s0) = 0; S = {s0};// s0 cú Nhón chớnh thức • Bƣớc 1: - Tớnh lại nhón tạm thời L(v), v∉ S : Nếu v kề với s0 thỡ L(v) = Min{L(v), L(s0) + m(s0,v)}; - Tỡm s1 ∉ S và kề với s0 sao cho :

L(s1) = Min{L(v) : ∀v ∉ S, }; (Khi đú : d(s0,s1 ) = L(s1) ) - S = S ∪ {s1}; // S = {s0, s1 } ; s1 cú nhón chớnh thức • Bƣớc 2: - Tớnh lại nhón tạm thời L(v), v∉ S : Nếu v kề với s1 thỡ L(v) = Min{L(v), L(s1) + m(s1,v)}; - Tỡm s2 ∉ S và kề với s1 hoặc s0 sao cho : L(s2 ) = Min{L(v) : ∀v ∉ S};

( Khi đú : d(s,s2 ) = L(s2) ); //0 = d(s0, s1) ≤ d(s0,s2)

Nếu L(s2) = Min{L(s2), L(s1) + m(s1,s2)} thỡ đƣờng đi từ s đến s2 đi qua đỉnh s1 là ngắn nhất, và s1 là đỉnh đứng kề trƣớc s2.

- S = S ∪ {s2}; // S = {s0, s1, s2 } ; //s2 cú nhón chớnh thức ...

• Bƣớc i:

Nếu v kề với si-1 thỡ L(v) = Min{L(v), L(si-1) + m(si-1,v)}; - Tỡm si ∉ S và kề với sj, j = 0, i − 1 sao cho :

L(si ) = Min{L(v) : ∀v ∉ S };

//0 = d(s,s1) ≤ d(s,s2) ≤ . . ≤ d(s,si)( d(s,si ) = L(si) );

Nếu L(si) = Min{L(si), L(sj) + m(sj,si)} thỡ đƣờng đi ngắn nhất từ s đến si đi qua đỉnh sj, và sj là đỉnh đứng kề trƣớc si.

- S = S ∪ {si}; // S = {s0,s1,..,si }; //si cú nhón chớnh thức

Thuật toỏn dừng khi i = n-1;

Khi thuật toỏn kết thỳc, ta cú :

0 = d(s0,s0) ≤ d(s0,s1) ≤ d(s0,s2) ≤ . . ≤ d(s0,sn-1).

Nếu chỉ tỡm đƣờng đi ngắn nhất từ s0 đến t, thỡ thuật toỏn dừng khi cú t ∈ S.

Tớnh chất tham lam của thuật toỏn Dijkstra

Tại mỗi bƣớc, chọn si ∉ S và si là đỉnh kề với sj, với j = 0, i − 1 sao cho L(si ) = Min{L(v) : ∀v ∉ S }.

Minh hoạ : Xột đồ thị cú hƣớng G (hỡnh dƣới)

Bƣớc 0 : L(s ) = ∞; ∀s d(1,1) = L(1) = 0; S = {1}; Bƣớc 1 : - Tớnh nhón tạm thời L(v), v∉ S : * Cỏc đỉnh ∉ S và kề với 1 là 2,3,5 : L(2) = Min{ L(2), L(1)+m(1,2)} = 20. L(3) = Min{ L(3), L(1)+m(1,3)} = 15. L(5) = Min{ L(5), L(1)+m(1,5)} = 80. * Cỏc đỉnh ∉ S và khụng kề với 1 là 4,6 : L(4) = L(6) = ∞.

- Tỡm s1 ∉ S và kề với 1 sao cho :L(s1 ) = Min{L(v) : ∀v ∉ S }; L(3) = Min{L(v) : ∀v ∉ S} = 15.

Đƣờng đi từ 1 đến 3 xỏc định bởi : 1 → 3 là ngắn nhất trong tất cả cỏc đƣờng đi từ 1 đến cỏc đỉnh khỏc và d(1,3) = L(3) = 15. - S = S ∪ {3}; // S = {1,3} Bƣớc 2 : - Tớnh nhón tạm thời L(v), v∉ S : * Cỏc đỉnh ∉ S và kề với 3 là 2,5, 6 : L(2) = Min{ L(2), L(3)+m(3,2)} = Min{ 20, 15+4} = 19. L(6) = Min{ L(6), L(3)+m(3,6)} = Min{ ∞, 15+10} = 25. L(4) = ∞. L(5) = 80 //Đó tớnh ở bƣớc 1.

- Tỡm s2 ∉ S và kề với 1 hoặc 3 sao cho : L(s2 ) = Min{L(v) : ∀v ∉ S };

L(2) = Min{L(v) : ∀v ∉ S} = Min{ L(2), L(3)+m(3,2)} = 19.

đƣờng đi từ 1 đến cỏc đỉnh j ≠ 3 và : d(1,2) = L(2) = 19. - S = S ∪ {2}; // S = {1,3,2} Bƣớc 3 : - Tớnh nhón tạm thời L(v), v∉ S : * Cỏc đỉnh ∉ S và kề với 2 là 5,6 : L(5) = Min{ L(5), L(2)+m(2,5)} = Min{ 80, 19+10} = 29. L(6) = Min{ L(6), L(2)+m(2,6)} = Min{ 25, 19+30} = 25 L(4) = ∞.

- Tỡm s3 ∉ S và kề với 1, 3 hoặc 2 sao cho : L(s3 ) = Min{L(v) : ∀v ∉ S };

L(6) = 25

Đƣờng đi từ 1 đến 6 xỏc định bởi : 1 → 3→ 6 là ngắn nhất trong tất cả cỏc đƣờng đi từ 1 đến cỏc đỉnh j ≠ 3, 2 và : d(1,6) = L(6) = 25 - S = S ∪ {6}; // S = {1,3,2, 6} Bƣớc 4 : - Tớnh nhón tạm thời L(v), v∉ S : * Cỏc đỉnh ∉ S và kề với 1,3,2 hoặc 6 là 4, 5: L(4) = Min{ L(4), L(6)+m(6,4)} = Min{ ∞, 25+4 } = 29 L(5) = 29 // Tớnh ở bƣớc trƣớc.

- Tỡm s4 ∉ S và kề với 1, 3,2 hoặc 6 sao cho : L(s4 ) = Min{L(v) : ∀v ∉ S };

L(4) = 29

Đƣờng đi từ 1 đến 4 xỏc định bởi : 1 → 3→ 6→ 4 là ngắn nhất trong tất cả cỏc đƣờng đi từ 1 đến cỏc đỉnh j ≠ 3, 2, 6 và : d(1,4) = L(4) = 29 - S = S ∪ {4}; // S = {1,3,2, 6,4} Bƣớc 5 : - Tớnh nhón tạm thời L(v), v∉ S : * Cỏc đỉnh ∉ S và kề với 1,2,3,4,6 là 5: L(5) = 29 // Tớnh ở bƣớc trƣớc.

- Tỡm s5 ∉ S và kề với 1, 3,2, 6 hoặc 4 sao cho : L(s5 ) = Min{L(v) : ∀v ∉ S };

L(5) = 29 // Tớnh ở bƣớc trƣớc.

Đƣờng đi từ 1 đến 5 xỏc định bởi : 1 → 3→ 2→ 5 là ngắn nhất trong tất cả cỏc đƣờng đi từ 1 đến cỏc đỉnh j ≠ 3, 2, 6, 4 và : d(1,5) = L(5) = 29

- S = S ∪ {5}; // S = {1,3,2, 6,4,5}

2.3.3. Xỏc định độ phức tạp của thuật toỏn

Thuật toỏn mụ tả bởi 2 vũng lặp lồng nhau nờn T(n) O(n2)

Một phần của tài liệu thiết kế thuật toán dựa trên ý tưởng của phương pháp tham lam (Trang 33 - 38)