Bài giảng Lý thuyết đồ thị - Bài 7+8: Bài toán đường đi ngắn nhất cung cấp cho người học các kiến thức: Các khái niệm mở đầu, đường đi ngắn nhất xuất phát từ 1 đỉnh, thuật toán Ford – Bellman, thuật toán Dijsktra, thuật toán Floyd,... Mời các bạn cùng tham khảo.
Bài 7, Bài toán đường ngắn Các khái niệm mở đầu Bài toán: Cho G = đồ thị có trọng số s t đỉnh đồ thị Hãy tìm đường có tổng trọng số nhỏ từ s đến t 20 VD: 15 15 9 Đường ngắn từ Etna đến Oldtown là: Etna – Bangor – Orono – OldTown Đường ngắn từ Hermae đến Etna là: Hermae – Hampdea – Bangor - Etna Các khái niệm mở đầu (tt) 10 20 -6 Tìm đường ngắn từ đỉnh đến đỉnh Trả lời: – – – ??? Độ dài 11 ngắn ??? Đường sao? Độ dài bao nhiêu? 3–4–2–5–2–5 Đường ngắn chưa??? Các khái niệm mở đầu (tt) Điều kiện để tốn có lời giải: Phải tồn đường từ s đến t: Đồ thị vô hướng liên thông Đồ thị có hướng liên thơng mạnh Đồ thị vơ hướng, s t nằm thành phần liên thơng Đồ thị có hướng, có tồn đường từ s đến t Trong đồ thị khơng tồn chu trình âm Đồ thị có hướng: khơng tồn chu trình âm Đồ thị vô hướng: không tồn cạnh âm -3 6 Đường ngắn xuất phát từ đỉnh Nhận xét: Nếu v đỉnh trung gian đường ngắn từ s đến t đường từ s đến v phải ngắn đường từ v đến t phải ngắn s … X … v … t Do đó, để tối ưu, người ta mở rộng tốn tìm đường ngắn từ đỉnh đến tất đỉnh lại đồ thị Đường ngắn xuất phát từ đỉnh (tt) Ý tưởng chung thuật tốn tìm đường ngắn Dị tìm cách thử qua đỉnh trung gian Nếu phát đường qua đỉnh trung gian ngắn đường cập nhật đường mới, đồng thời chỉnh sửa thông tin liên quan Sử dụng hai mảng để lưu trữ tạm thời: Mảng d[v]: Lưu trữ độ dài đường ngắn từ s đến v Mảng T[v]: Lưu trữ đỉnh nằm trước v đường ngắn Đường ngắn xuất phát từ đỉnh (tt) Ý tưởng chung thuật tốn tìm đường ngắn (tt): Truoc[v] d[v] … X … s d[u] v u c[u,v] if d[v] > d[u] + c[u,v] then { d[v] = d[u] + c[u,v]; Truoc[v] = u; } Thuật toán Ford-Bellman (* Khởi tạo *) for v V do Begin d[v]:=c[s,v]; Truoc[v]:=s; End; (* Bắt đầu *) d[s]:=0; for k:=1 to n2 do for v V\{ s} do for u V do if d[v] > d[u] +a[u,v] then Begin d[v]:=d[u]+c[u,v]; Truoc[v]:=u; End; k 0,1 1,1 ,1 ,1 3,1 0,1 1,1 4,2 4,2 -1,3 0,1 1,1 4,2 3,5 -1,3 0,1 1,1 4,2 3,5 -1,3 Thuật toán Ford-Bellman (tt) Cây kết quả: k 0,1 1,1 ,1 ,1 3,1 0,1 1,1 4,2 4,2 -1,3 0,1 1,1 4,2 3,5 -1,3 0,1 1,1 4,2 3,5 -1,3 Thuật toán Ford – Bellman (tt) k 0,1 1,1 S=1 , , ,1 ,1 0,1 1,1 ,2 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,6 ,3 0,1 1,1 ,4 ,2 ,6 ,3 10 Ford-Bellman (tt) Cây kết k 0,1 1,1 , , ,1 ,1 1 0,1 1,1 ,2 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,6 ,3 0,1 1,1 ,4 ,2 ,6 ,3 11 Thuật toán Ford-Bellman (tt) Nhận xét: Áp dụng cho trường hợp Chi phí tính tốn lớn dùng vịng lặp lồng Thường lãng phí số bước sau Cải tiến: Không thể cải tiến tốt cho trường hợp tổng quát Chỉ làm tốt cho số trường hợp riêng 12 Thuật toán Dijsktra (tt) Nhận xét FordBell man: k 0,1 1,1 , , ,1 ,1 1 0,1 1,1 ,2 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,4 ,3 0,1 1,1 ,4 ,2 ,6 ,3 0,1 1,1 ,4 ,2 ,6 ,3 Kết bảng ổn định từ sớm Trên dòng, giá trị d nhỏ không thay đổi sau trọng số cạnh khơng âm 13 Thuật tốn Dijkstra Chú ý: thuật toán dùng cho đồ thị khơng có cạnh âm Ý tưởng: Do khơng có cạnh âm nên bước, có đỉnh mà thơng tin khơng thay đổi sau Tại bước, ta không cần phải kiểm tra qua tất đỉnh trung gian, mà thực sau: Chọn đỉnh u có giá trị d[u] nhỏ Chọn u làm đỉnh trung gian để xác định bước 14 Thuật toán Dijsktra (tt) (* Khởi tạo *) for v V Begin d[v]:=a[s,v]; Truoc[v]:=s; End; d[s]:=0; T:=V\{s} ; (* T tập đỉnh chưa cố định *) (* Bước lặp *) k while T Begin 0, Tìm đỉnh u T thoả mãn d[u]=min{d[z]:z T}; T:=T\{u} ; (* Cố định nhãn đỉnh u*) For v T If d[v]>d[u]+a[u,v] then Begin d[v]:=d[u]+a[u,v]; Truoc[v]:=u; End; End; 1,1* , ,1 ,1 ,1 ,2 ,2* ,1 ,2 ,4 ,2 ,4 ,3* ,4* ,6* 15 Thuật toán Dijsktra (tt) k , ,1 ,1 ,1 ,2 ,2* ,1 ,2 ,4* ,4 ,2 ,4 ,3* ,6* 0, 1,1* 16 Đường ngắn tất cặp đỉnh Thuật toán Floyd: Đầu vào: Ma trận kề trọng số A Đầu ra: Ma trận đường ngắn nhất: d Ma trận lưu đỉnh trước đường đi: p 17 Thuật toán Floyd (tt) // Khởi tạo For i:=1 to n For j:=1 to n { d[i,j] := a[i,j]; p[i,j] := i; } // Bước lặp For k:=1 to n For i:=1 to n For j:=1 to n If (d[i,j] > d[i,k] + d[k,j]) { d[i,j] := d[i,k] + d[k,j]; p[i,j] := p[k,j]; } 10 10 6 Ma trận d 10 2 1 3 4 1 3 4 Ma trận p 18 Thuật toán Floyd (tt) 10 Khởi tạo 10 10 10 k=2 10 2 1 1 1 2 2 3 3 4 4 Ma trận p Ma trận d 10 k=1 5 2 1 2 1 4 1 3 4 4 1 3 4 10 10 5 3 10 2 2 1 2 1 4 4 4 4 4 1 3 4 k=3 1 k=4 3 4 19 Thuật toán Floyd (tt) 10 5 3 4 2 4 1 1 4 4 3 4 4 Đọc đường đi: Từ đến 3: Trước p[1,3] = Vậy đỉnh nằm trước đường Trước p[1,4] = Vậy đỉnh nằm trước đường Dừng Đường là: – – với độ dài d[1,3] = Tương tự, đường ngắn từ đến là: – – với độ dài p[3,2] = 20 ... liên thơng Đồ thị có hướng, có tồn đường từ s đến t Trong đồ thị khơng tồn chu trình âm Đồ thị có hướng: khơng tồn chu trình âm Đồ thị vô hướng: không tồn cạnh âm -3 6 Đường ngắn xuất phát... gian đường ngắn từ s đến t đường từ s đến v phải ngắn đường từ v đến t phải ngắn s … X … v … t Do đó, để tối ưu, người ta mở rộng tốn tìm đường ngắn từ đỉnh đến tất đỉnh lại đồ thị Đường ngắn. .. 3–4–2–5–2–5 Đường ngắn chưa??? Các khái niệm mở đầu (tt) Đi? ??u kiện để tốn có lời giải: Phải tồn đường từ s đến t: Đồ thị vô hướng liên thông Đồ thị có hướng liên thơng mạnh Đồ thị vô hướng,