Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 5: Đồ thị. Những nội dung chính được trình bày trong chương 5 gồm có: Định nghĩa đồ thị, biểu diễn đồ thị, phép duyệt đồ thị, cây khung và cây khung với giá trị cực tiểu, bài toán tìm đường đi ngắn nhất. Mời các bạn cùng tham khảo.
Chương 5: Đồ thị Các khái niệm 1.1 Định nghĩa đồ thị Đồ thị G(V,E) bao gồm tập hữu hạn V đỉnh (hay nút) tập hữu hạn E cặp đỉnh mà ta gọi cung ( hay cạnh) Ví dụ 1: Một mạng gồm máy tính kênh điện thoại nối máy tính đồ thị Ví dụ 2: Một mạng gồm thành phố, thị xã đường nối thành phố, thị xã đồ thị 1.2 Định nghĩa đồ thị vô hướng Đồ thị vô hướng G=(V,E) bao gồm V tập đỉnh E tập cặp đỉnh khơng có thứ tự gọi cung * Nếu (v1, v2) cung tập E(G) v1 v2 gọi lân cận Ví dụ 1,2 lân cân, 1,3 lân cận * Một đường từ đỉnh u đến đỉnh v đồ thị dãy đỉnh u=x0, x1, , xn-1, xn=v mà dãy cạnh (x0, x1), (x1, x2), , (xn-1, xn) cung thuộc E(G) * Số lượng cung đường gọi độ dài đường Ví dụ đường từ đến có độ dài * Đường đơn: Là đường mà đỉnh đó, trừ đỉnh đầu đỉnh cuối khác * Một chu trình đường đơn mà đỉnh đầu đỉnh cuối trùng Ví dụ: 1→ → 5→ 4→1 Phép duyệt đồ thị * Xét đồ thị vô hướng G(V,E) đỉnh v∈V Ta cần thăm tất đỉnh G mà “ với tới” từ đỉnh v ( nghĩa đồ thị liên thơng) Có cách duyệt đồ thị: - Phép tìm kiếm theo chiều sâu ( Depth first search ) - Phép tìm kiếm theo chiều rộng (Breadth first search ) 3.1 Phép tìm kiếm theo chiều sâu ( Depth first search ) Xét đồ thị vơ hướng Phép tìm kiếm theo chiều sâu thể sau: - Đỉnh xuất phát v thăm - Tiếp theo ta thăm đỉnh w đỉnh chưa thăm lân cận v Phép tìm kiếm theo chiều sâu xuất phát từ w lại thực Trong trường hợp đỉnh u thăm mà đỉnh lân cận thăm ta quay lại đỉnh cuối vừa thăm ( mà đỉnh cịn đỉnh w lân cận chưa thăm) phép tìm kiếm theo chiều sâu xuất phát từ w lại thực Phép duyệt theo chiều sâu theo trình tự sau: v1 → v2 → v4 → v8 → v5 → v6 → v3 → v7 * Thủ tục phép duyệt theo chiều sâu sau: Cho đồ thị G(V,E) vơ hướng có n đỉnh véc tơ Visited(n) gồm n phần tử, ban đầu véc tơ có giá trị =0 Thuật giải thực thăm đỉnh “ với tới “ từ đỉnh v Procedure DFS(v) 1) Visited[v]:=1; { đánh dấu v thăm } 2) Write(v); {Đưa đỉnh v} 3) FOR đỉnh w lân cận với v DO If Visited[w] = then CALL DFS(w); Return * Đánh giá thuật toán: + Trường hợp biểu diễn đồ thị dùng danh sách móc nối: G có e cung, nút với tới lần, nên thời gian tìm kiếm O(e) + Trường hợp biểu diễn đồ thị dùng ma trận lân cận : thời gian xác định điểm lân cận v O(n) Có n đỉnh nên thời gian tìm kiếm O(n2) 3.2 Phép tìm kiếm theo chiều rộng (Breadth first search ) Xét đồ thị vơ hướng Phép tìm kiếm theo chiều rộng thể sau: - Đỉnh xuất phát v thăm - Tiếp theo đỉnh chưa thăm mà lân cận v thăm, đến đỉnh chưa thăm lân cận lượt đỉnh tương tự Ví dụ trên: Phép duyệt theo chiều rơng theo trình tự sau: v1 → v2 → v3 → v4 → v5 → v6 → v7 → v8 * Thủ tục phép duyệt theo chiều rong sau: Cho đồ thị G(V,E) vơ hướng có n đỉnh véc tơ Visited(n) gồm n phần tử, ban đầu véc tơ có giá trị =0 Thuật giải thực thăm đỉnh “ với tới “ từ đỉnh v Bắt đầu từ đỉnh v Mọi đỉnh i thăm đánh dấu Visited(i):=1 Dùng hàng đợi Q có kích thước n; F, R lối trước lối sau hàng đợi Khi thăm đình loại bỏ khỏi hàng đợi; chưa thăm bổ sung vào hàng đợi Procedure BFS(v) 1) Khởi tạo hàng đợi Q với v đưa vào 2) Visited[v]:=1; { đánh dấu v thăm } 3) Write(v); {Đưa v} 4) While Q không rỗng DO Begin Call CQDELETE(v,Q) { loại bỏ v khỏi Q} FOR đỉnh w lân cận với v DO Begin If Visited[w]=0 then Begin Visited[w]:=1; Write(w); CALL CQINSERT(w,Q); { Bổ sung w vào Q} End End End Return * Đánh giá giải thuật: Vòng lặp While lặp lại n lần - Nếu biểu diễn đồ thị ma trận lân cận thời gian thực O(n2) - Nếu biểu diễn đồ thị danh sách lân cận thời gian thực O(e) Cây khung khung với giá trị cực tiểu 4.1 Cây khung * Nếu G đồ thị liên thơng phép tìm kiếm theo chiều sâu theo chiều rộng xuất phát từ đỉnh thăm đỉnh Như cung G phân thành tập: - Tập T chứa cung duyệt qua - Tập b gồm cung lại * Tất cung đỉnh T tạo thành bao gồm đỉnh G Cây gọi khung G 4.2 Cây khung với giá trị cực tiểu * Bài toán: Xác định khung với giá trị cực tiểu đồ thị liên thơng có trọng số Gía trị khung tổng trọng số ứng với cạnh khung * Có nhiều giải thuật xác định khung với giá trị cực tiểu phần ta xét giải thuật Kruskal Với giải thuật khung T xây dựng dần cung Các cung đưa vào T thoả mãn: - Cung có giá trị cực tiểu cung cịn lại - Khơng tạo chu trình với cung có T * Giải thuật Kruskal viết sau: T=Φ { T rỗng While T chứa (n-1) cung Do Begin Chọn cung (v,w) từ E có giá trị nhỏ Loại (v,w) khỏi E If (v,w) không tạo nên chu trình T Then đưa (v,w) vào T End; Return * Đánh giá giải thuật: Thời gian thực giải thuật xác định qua thực bước Trường hợp xấu O(e.log e) e số cung đồ thị G Bài tốn tìm đường ngắn ( Bài tốn nguồn đích) ( Single source all destination ) * Cho đồ thị có hướng G(V,E), hàm trọng số w(e) cho cung e G đỉnh nguồn v0 Bài toán đặt là: Xác định đường ngắn từ v0 đến đỉnh lại G ( độ dài đường tổng trọng số cung đường trọng số dương ) * Gọi S tập đỉnh kể v0 mà đường ngắn xác lập Đối với đỉnh w ∈ S, gọi Dist(w) độ dài đường ngắn từ v0 qua đỉnh S kết thúc w có số nhận xét sau: Nếu đường ngắn tới w đường v0 kết thúc w qua đỉnh thuộc S Đích đường sinh phải đỉnh w ∉ S mà có Dist(w) ngắn so với đỉnh ∉S Nếu chọn đỉnh w nhận xét sinh đường ngắn từ v0 đến w w trở thành phần tử S * Dưa quan điểm nhận xét nêu Diskstra đưa giải thuật tìm đường ngắn sau: - Giả thiết n đỉnh G đánh số từ tới n - Tập S thể véc tơ bít: S[i] = đỉnh i ∉ S S[i] = đỉnh i ∈S - Độ dài trọng số biểu diễn ma trận lân cận Cost: Cost[i,j] trọng số cung (i,j) Cost[i,j] = + ∞ cung (i,j) khơng có Cost[i,j] = i=j Ví dụ ma trận lân cân Cost sau: v0 v1 v2 v3 v4 v5 v0 50 10 +∞ 45 +∞ v1 + ∞ 15 +∞ 10 +∞ v2 20 +∞ 15 +∞ +∞ v3 + ∞ 20 +∞ 35 +∞ v4 + ∞ +∞ +∞ 30 +∞ v5 + ∞ +∞ +∞ +∞ * Giải thuật: Procedure Shortest_Path(v,Cost,Dist,n) { Dist(j) 1