Lý thuyết đồ thị - Tìm đường đi ngắn nhất với Floyd

3 12 0
Lý thuyết đồ thị - Tìm đường đi ngắn nhất với  Floyd

Đang tải... (xem toàn văn)

Thông tin tài liệu

[r]

(1)

Lý thuy t đ ị

Tìm đường ng n nh t v i Floyd ấ ớ

Lý thuy tế

Thu t tốn Floyd cho phép tìm đậ ường ng n nh t gi a hai đ nh b t kỳ đ th Do đóắ ấ ữ ỉ ấ ị

chi phí c a thu t tốn Floyd có th l n nh ng bù l i, ta có th t n d ng đ tính trủ ậ ể ể ậ ụ ể ước k tế

qu ch m t l n ch y thu t toán nh t.ả ỉ ộ ầ ậ ấ

Tìm hi u qua ví d

Vd: cho đ th sau:ồ ị

Ta s l p m t b ng L mô t đẽ ậ ộ ả ả ường ng n nh t t m t đ nh i đ n m t đ nh j nh sau:ắ ấ ộ ỉ ế ộ ỉ

t i \ đ nừ ế

j

0

0 0

1 0

2 0 0

3 0

L u ý: giá tr tr ng ng v i tr – khơng có đư ị ố ứ ị ường Khi cài đ t c n xét riêng trặ ầ ường h p giá tr 0.ợ ị

Nh n xét: ta có t → hi n gi ch a có đậ ệ ường (chi phí 0) Ta th y m tấ ộ

đường gián ti p t → r i t → v i chi phí + = C p nh t l i b ng L trên:ế ừ ậ ậ ả

t i \ đ nừ ế j

0 1 3

0

1

2 (qua 3)

3

M t trộ ường h p khác n a t → có chi phí hi n t i Ta th y m t đợ ữ ệ ấ ộ ường gián ti p t → r i t → v i chi phí + = bé h n chi phí lúc đ u C p nh tế ừ ầ ậ ậ

l i b ng L trên:ạ ả

t i \ đ nừ ế

j 0 1 3

0

1 (qua 0)

2 (qua 3)

3

1 Lê Th y Anhụ

0

1

3

6

(2)

Lý thuy t đ ị

Cu i cùng, ta ch cịn tìm đố ỉ ược m trộ ường h p n a t → ch a có đợ ữ ường Phát hi n đệ ường t → r i t → có chi phí + = C p nh t l i b ng L trên:ừ ậ ậ ả

t i \ đ nừ ế

j

0

0

1 (qua 3) (qua 0)

2 (qua 3)

3

Lúc ta khơng cịn tìm m t c i ti n n a c ộ ả ế ữ ả

N u ngế ười dùng yêu c u tìm đầ ường ng n nh t t đ n 2, ta có th xác nh n chi phíắ ấ ế ể ậ

b ng Đằ ường nh sau:ư

1 → (có → qua 3) → → (có → qua 0) → → →

K t qu tìm đế ả ược đường → → →

L u ýư : th t t r t quan tr ng Gi s tìm cách c i ti n theo th t sauứ ự ệ ấ ọ ả ả ế ứ ự

(sinh viên ki m tra l i giá tr b ng L gi y đ hi u rõ h n):ể ị ả ấ ể ể

1 → r i → thay cho → (chi phí 8)ồ

2 → r i → thay cho → (chi phí m i 5, cũ 6)ồ

3 1 → r i → thay cho → (chi phí m i 7, chi phí cũ 8).

4 …

khi ta s ph i t r t nhi u l n m t trẽ ả ệ ấ ề ầ ộ ường h p.ợ

Tóm t t thu t tốn Floyd

// kh i t o L[][] b ng v i ma tr n k c a đ thở ằ ậ ề ủ ị

for (i…) for (j…)

if (L[j][i] > 0) {

for (k…)

if (L[i][k] > 0)

if (L[j][k] == || // ch a có đư ường t j → k

L[j][k] > L[j][i]+L[i][k] // đường trung gian ng n h n)ắ

{

L[j][k] = L[j][i]+L[i][k]; TG[j][k] = i;

} }

2 Lê Th y Anhụ

i

(3)

Lý thuy t đ ị

L u ýư : Nh lư ưu ý ví d , th t t r t quan tr ng, sinh viên c n l u ụ ứ ự ệ ấ ọ ầ th t cácứ ự

vòng for i, j, k

Cài đ t – C u trúc d li u ữ ệ

C n hai m ng hai chi uầ ả ề

int L[MAX][MAX]; // dùng double n u ma tr n k dùng ki u th cế ậ ề ể ự

int TG[MAX][MAX];

Cài đ t – hàm Floyd

Sinh viên t cài đ tự ặ

Cài đ t – hàm PrintMinRoute

void PrintMinRoute(nStartNode, nEndNode) {

if (L[nStartNode][nEndNode] <= 0) printf(“Khong co duong di…); else {

printf(“Chi phí đường đi…”);

// dò ngược l i đạ ường đi, b t đ u t đ nh nEndNodeắ

k = nEndNode;

while (k != nStartNode) { printf(“%d < ”, k);

// th t t, đứ ường t nStartNode đ n kừ ế // s có đ nh TG[nStartNode][k] n m trẽ ước đ nh kỉ

k = TG[nStartNode][k]; }

printf(“%d “, k); }

}

Cài đ t – hàm main

void main() {

Nhap_Ma_Tran_Ke();

Floyd(); // ta ch ch y Floyd m t l n cho m t đ thỉ

do {

// có th tìm nhi u để ường khác nhau

Nhap_Dinh_XuatPhat_KetThuc();

PrintMinRoute(nStartNode, nEndNode); while (Nguoi_Dung_Muon_Chay_Tiep);

}

Ngày đăng: 10/03/2021, 14:06

Tài liệu cùng người dùng

Tài liệu liên quan