Bài giảng Cơ sở dữ liệu giải thuật: Bài 13 - Đồ thị (Phần 1) bao gồm những nội dung về đồ thị và các khái niệm liên quan, cài đặt đồ thị, một số bài toán tiêu biểu, đồ thị và C++. Mời các bạn tham khảo bài giảng để bổ sung thêm kiến thức về lĩnh vực này.
Bài 13: Đồ thị (P1) Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – Đại học Công Nghệ Mục tiêu học Đồ thị khái niệm liên quan Cài đặt đồ thị Một số toán tiêu biểu – Đi qua/duyệt đồ thị • BFS, DFS – Sắp xếp topo đồ thị định hướng khơng có chu trình – Tìm đường ngắn • Từ đỉnh nguồn • Giữa cặp đỉnh – Tìm bao trùm ngắn • Prim • Kruskal Đồ thị C++ diepht@vnu Đồ thị khái niệm liên quan diepht@vnu Định nghĩa: Đồ thị • Đồ thị mơ hình tốn học – sử dụng để biểu diễn tập đối tượng có quan hệ với theo cách • Định nghĩa hình thức – Đồ thị G xác định cặp (V, E), – V tập đỉnh – E tập cạnh nối cặp đỉnh E ⊆ {(u,v) | u, v ⊆ V} • Đồ thị vơ hướng – quan hệ định nghĩa cạnh quan hệ đối xứng – E ⊆ {{u,v} | u, v ⊆ V} • Đồ thị định hướng – (u, v) ≠ (v, u) diepht@vnu diepht@vnu Ví dụ: đồ thị vô hướng – định hướng Cầu Giấy Cầu Giấy BX Kim Mã ĐHQG Ngã tư Sở diepht@vnu BX Kim Mã ĐHQG Ngã tư Sở Ví dụ • • • • • Mạng vận tải (transportation networks) Mạng liên lạc (communication networks) Mạng thông tin (information networks) Mạng xã hội (social networks) Mạng phụ thuộc (dependency networks) Định hướng hay vô hướng? diepht@vnu Định nghĩa: Đường • Trong đồ thị vô hướng G=(V,E) – Đường • dãy P đỉnh v1, v2, …, vk • có tính chất đỉnh liên tiếp vi, vi+1 nối cạnh G • P gọi đường từ v1 đến vk – Chu trình đường v1, v2, …, vk với k > k-1 đỉnh phân biệt v1 = vk • Với đồ thị có hướng, đường hay chu trình, đỉnh liên tiếp (vi, vi+1) phải cung thuộc E diepht@vnu Ví dụ: đồ thị có chu trình – khơng có chu trình diepht@vnu Định nghĩa: Tính liên thơng • Đồ thị vô hướng liên thông tồn đường từ u đến v với cặp đỉnh (u, v) • Đồ thị có hướng liên thơng yếu đồ thị vơ hướng tảng đồ thị liên thông liên thông mạnh tồn đường từ u đến v đường từ v đến u với cặp đỉnh (u, v) diepht@vnu 10 Hai cách biểu diễn đồ thị 1 4 0 0 1 0 0 0 1 1 0 4 diepht@vnu Với đồ thị vô hướng? 16 Cài đặt: Biểu diễn ma trận kề 4 0 0 1 0 0 0 1 1 0 const int N = 5; typedef bool Graph[N][N]; … Graph g1; g1[0][0] = 0; g1[0][1] = 1; … diepht@vnu 17 Cài đặt: Biểu diễn danh sách kề 1 3 4 struct Cell{ int vertex; Cell * next; }; const int N = 5; typedef Cell * Graph[N]; … Graph g2; addFirst(g2[0], 3); addFirst(g2[0], 1); diepht@vnu 18 So sánh phương pháp biểu diễn • Các yếu tố cần xét – Độ phức tạp thời gian phép truy cập tới thông tin cặp đỉnh u, v – Độ phức tạp không gian biểu diễn đồ thị – Độ phức tạp thời gian phép khảo sát tập đỉnh kề với đỉnh u cho trước diepht@vnu 19 Một số toán tiêu biểu diepht@vnu 20 Đi qua đồ thị theo bề rộng • Sử dụng kĩ thuật tìm kiếm theo bề rộng – Breadth-First Search • Ý tưởng tìm kiếm theo bề rộng xuất phát từ đỉnh v – Từ đỉnh v ta thăm tất đỉnh u kề đỉnh v mà u chưa thăm – Sau đó, đỉnh thăm trước đỉnh kề thăm trước – Quá trình tiếp tục ta thăm đỉnh diepht@vnu 21 Ví dụ BFS(1) diepht@vnu 22 BFS(v) Algorithm BFS(v) // Tìm kiếm theo bề rộng xuất phát từ v Input: Đỉnh v chưa thăm Khởi tạo hàng đợi Q rỗng; Đánh dấu đỉnh v thăm; Q.enqueue(v) while Q.empty() ≠ TRUE w Q.dequeue() for (mỗi đỉnh u kề w) if ( u chưa thăm) Đánh dấu u thăm; Q.enqueue(u) diepht@vnu 23 Thuật toán qua đồ thị G theo bề rộng Algorithm BFSTraversal(G) // Đi qua đồ thị G=(V, E) theo bề rộng for (mỗi v ∈V) Đánh dấu v chưa thăm; for (mỗi v ∈V) if (v chưa thăm) BFS(v); • Phân tích • Ứng dụng – Vấn đề đạt tới: Giả sử v w hai đỉnh bất kỳ, ta muốn biết từ đỉnh v có đường tới đỉnh w hay khơng? – Tính liên thông thành phần liên thông đồ thị vô hướng diepht@vnu 24 Đi qua đồ thị theo độ sâu • Sử dụng kĩ thuật tìm kiếm theo độ sâu – Depth-First Search • Ý tưởng tìm kiếm theo độ sâu xuất phát từ đỉnh u – Từ đỉnh u ta đến thăm đỉnh v kề đỉnh u Rồi lại từ đỉnh v ta đến thăm đỉnh w kề v Cứ tiếp tục chừng – Khi đạt tới đỉnh v mà v ta khơng thăm tiếp • quay lại đỉnh u từ đỉnh u ta thăm đỉnh v’ khác kề u (nếu có), từ v’ lại thăm tiếp đỉnh kề v’,… • Q trình tiếp diễn ta tới thăm đỉnh diepht@vnu 25 Ví dụ DFS(1) diepht@vnu 26 DFS(v) Algorithm DFS(v) // Tìm kiếm theo độ sâu xuất phát từ v Input: Đỉnh v chưa thăm for (mỗi đỉnh u kề v) if ( u chưa thăm) Đánh dấu u thăm; DFS(u) diepht@vnu 27 Thuật toán qua đồ thị G theo độ sâu Algorithm DFSTraversal(G) // Đi qua đồ thị G=(V, E) theo độ sâu for (mỗi v ∈V) Đánh dấu v chưa thăm; for (mỗi v ∈V) if (v chưa thăm) Thăm v đánh dấu v thăm; DFS(v); • Phân tích • Ứng dụng – Phân lớp cung • Phát chu trình đồ thị diepht@vnu 28 Lịch trình Tuần 14, 15 Đồ thị khái niệm liên quan Cài đặt đồ thị Một số toán tiêu biểu Tuần 16 • Ơn tập Thi cuối kỳ vào 25/12 – Đi qua/duyệt đồ thị – Sắp xếp topo đồ thị định hướng khơng có chu trình – Tìm đường ngắn – Tìm bao trùm ngắn Đồ thị C++ diepht@vnu 29 Chuẩn bị tới • Đọc tiếp chương 18 giáo trình (Đồ thị) diepht@vnu 30 ... chứa chu trình • Đồ thị có/khơng có trọng số • Đồ thị có/khơng có nhãn [Xem thêm trang “Thuật ngữ lý thuyết đồ thị? ?? http://vi.wikipedia.org] diepht@vnu 13 Ví dụ: đồ thị có trọng số - không trọng... trình đồ thị diepht@vnu 28 Lịch trình Tuần 14, 15 Đồ thị khái niệm liên quan Cài đặt đồ thị Một số toán tiêu biểu Tuần 16 • Ơn tập Thi cuối kỳ vào 25/12 – Đi qua/duyệt đồ thị – Sắp xếp topo đồ thị. .. đỉnh (u, v) • Đồ thị có hướng liên thơng yếu đồ thị vơ hướng tảng đồ thị liên thông liên thông mạnh tồn đường từ u đến v đường từ v đến u với cặp đỉnh (u, v) diepht@vnu 10 Ví dụ: đồ thị vơ hướng