1. Trang chủ
  2. » Giáo án - Bài giảng

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

3 13 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 120,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

[r]

Trang 1

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

Lý thuy t ế

Thu t toán Floyd cho phép tìm đậ ường đi ng n nh t gi a hai đ nh b t kỳ trong đ th Do đóắ ấ ữ ỉ ấ ồ ị chi phí c a thu t toá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 trong m t l n ch y thu t toán duy 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 đi ng n nh t t m t đ nh i đ n m t đ nh j nh sau:ắ ấ ừ ộ ỉ ế ộ ỉ ư

t i \ đ nừ ế j

0 1 2 3

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

h p giá tr 0.ợ ị

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

đường đi gián ti p t 0 → 3 r i t 3 → 2 v i chi phí là 3 + 2 = 5 C p nh t l i b ng L trên:ế ừ ồ ừ ớ ậ ậ ạ ả

t i \ đ n ừ ế j

M t trộ ường h p khác n a là t 1 → 3 có chi phí hi n t i là 6 Ta th y ngay m t đợ ữ ừ ệ ạ ấ ộ ường đi gián ti p t 1 → 0 r i t 0 → 3 v i chi phí là 2 + 3 = 5 bé h n chi phí lúc đ u C p nh tế ừ ồ ừ ớ ơ ầ ậ ậ

l i b ng L trên:ạ ả

t i \ đ n ừ ế

0

3

2

6 3

2

Trang 2

Cu i cùng, ta ch còn tìm đố ỉ ược m trộ ường h p n a là t 1 → 2 ch a có đợ ữ ừ ư ường đi Phát

hi n ra đệ ường đi t 1 → 3 r i t 3 → 2 có chi phí là 5 + 2 = 7 C p nh t l i b ng L trên:ừ ồ ừ ậ ậ ạ ả

t i \ đ nừ ế j

Lúc này ta không còn tìm được m t c i ti n nào n a c ộ ả ế ữ ả

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

b ng 7 Đằ ường đi nh sau:ư

1 → 2 (có 1 → 2 đi qua 3)

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

1 → 0 → 3 → 2

K t qu tìm đế ả ược là đường đi 1 → 0 → 3 → 2

L u ý ư : th t duy t r t quan tr ng Gi s chúng ta tìm ra cách c i ti n theo th t sauứ ự ệ ấ ọ ả ử ả ế ứ ự (sinh viên ki m tra l i giá tr b ng L trên gi y đ hi u rõ h n):ể ạ ị ả ấ ể ể ơ

1 1 → 3 r i 3 → 2 thay cho 1 → 2 (chi phí là 8)ồ

2 1 → 0 r i 0 → 3 thay cho 1 → 3 (chi phí m i là 5, cũ là 6)ồ ớ

3 1 → 3 r i 3 → 2 thay cho 1 → 2 (chi phí m i là 7, chi phí cũ là 8) ồ ớ

4 …

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

Tóm t t thu t toá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] == 0 || // ch a có đ ư ườ ng đi t j ừ → k

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

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

TG[j][k] = i;

}

i

k j

Trang 3

L u ý ư : Nh đã lư ưu ý trong ví d , th t duy 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);

// do th t duy t, đ ứ ự ệ ườ ng đi 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 {

// và có th tìm nhi u đ ể ề ườ ng đi 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Ừ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w