1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng lý thuyết đồ thị chương 6 tôn quang toại

32 5 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 32
Dung lượng 299,32 KB

Nội dung

CHƯƠNG 6 CÂY Tơn Quang Toại Khoa CNTT, Đại học Ngoại ngữ ‐ Tin học TP.HCM Nội dung Khái niệm Cây Các tính chất cơ bản của Cây Cây khung của đồ thị Cây khung nhỏ nhất Khái niệm cây Định nghĩa Cây (Tree): Cây là  Đồ̀ thị vơ hướng,  liên thơng và  khơng có chu trình B E F B E C D A A C D G1 G2 F Khái niệm cây Định nghĩa Rừng (Forest): Rừng là đồ thị khơng có chu trình B A G C F D E I L J K H • Nhận xét: Rừng đồ thị mà thành phần liên thơng Các tính chất cơ bản của Cây Định lý: Cho đồ̀ thị vơ hướng G=(V, E) có n đỉnh. Các mệnh đề̀  sau tương đương: (1) G (2) G không chứa chu trình có n-1 cạnh (3) G liên thơng có n-1 cạnh (4) G liên thơng cạnh điều cầu (5) Giữa hai đỉnh G nối với đường (6) G không chứa chu trình thêm vào cạnh ta thu chu trình Các tính chất cơ bản của Cây Sơ đồ chứng minh: Chứng minh: : Các tính chất cơ bản của Cây Chứng minh Các tính chất cơ bản của Cây Chứng minh Các tính chất cơ bản của Cây Chứng minh Các tính chất cơ bản của Cây Chứng minh Cây khung nhỏ nhất Thuật tốn tìm khung nhỏ Có nhiều thuật tốn xây dựng khung nhỏ nhất: • • • • • • • Thuật toán Boruvka Thuật toán Kruskal Thuật toán Jarnik – Prim Phương pháp Dijkstra Thuật tốn Cheriton – Tarjan Thuật tốn Chazelle …  Cây khung nhỏ nhất Thuật tốn tìm khung nhỏ Thuật tốn Kruskal:  Ý tưởng của thuật tốn Kruskal:  • Ban đầu cây T=(V, Ø) (Cây rỗng) • Lần lược chọn đủ (n‐1) cạnh có trọng số từ nhỏ đến lớn  vào cây T sao cho khơng được tạo thành chu trình Thuật tốn Jarnik – Prim: Ý tưởng của thuật tốn Jarnik – Prim:  • Ban đầu cây T chỉ có 1 đỉnh.  • Lần lược chọn thêm (n‐1) đỉnh vào cây T sao cho đỉnh  được chọn vào cây có cạnh đến một trong các đỉnh của  cây là là nhỏ nhất Cây khung nhỏ nhất Thuật tốn Kruskal Input: G=(V, E) Output: Danh sách cạnh cay[] Bước 1 (Sắp xếp) Sắp xếp cạnh có trọng số tang dần Bước (Chọn n‐1 cạnh) Xét cạnh theo thứ tự xếp (cạnh nhỏ chọn trước) Chọn (n-1) cạnh theo quy tắc: • Cạnh chọn cạnh chọn trước khơng tạo thành chu trình Cây khung nhỏ nhất Ví dụ: Dùng thuật tốn Kruskal để  m cây  khung nhỏ nhất của đồ thị sau: C 6 B H G D F 5 J E I K A Cây khung nhỏ nhất Cấu trúc dữ liệu LinkedList edgeList; int m; int n; LinkedList spanningTree; bool[,] connected; connected[u][v] cho biết đỉnh u có liên thơng với v khơng: • connected[u][v] = true u và v liên thông với v u Cây khung nhỏ nhất Vấn đề: Chúng ta phải cập nhật bảng connected[][] nào? u v y x Lúc u v chưa nối {x} {y} chưa liên thơng Nếu nối u với v phải cập nhật đỉnh {x} liên thông với đỉnh {y} – Chúng ta dùng for toàn bên x bên y để cập nhật mảng connected[][] Cây khung nhỏ nhất Thuật tốn Kruskal tóm tắt Bước 1 (Sắp xếp) Sắp xếp cạnh theo thứ tự tăng dần trọng số Bước 2: Lặp (n‐1) lần Xét cạnh theo thứ tự xếp (cạnh nhỏ xét trước) • [Tìm cạnh]: Tìm cạnh (u, v) khơng liên thơng đưa vào T • [Cập nhật]: Cập nhật 2 miền liên thơng chứa đỉnh {u} và  {v} tương ứng thành 1 miền Cây khung nhỏ nhất void Kruskal() { } Cây khung nhỏ nhất Một số cách kiểm tra 2 đỉnh có liên thơng hay  khơng: Dùng mảng 2 chiều: int connected[][]; connected[i][j] = true nếu i liên thơng j (=0 ngược  lại) Dùng mảng 1 chiều: int connected[]; connected[i] = connected[j] thì i liên thơng j Dùng Union‐Find set Cây khung nhỏ nhất Thuật tốn Jarnik – Prim Bước 1: Chọn đỉnh x0 đánh dấu x0 Bước 2: Lặp (n-1) lần • Chọn cạnh (x, y) thỏa điều kiện: – x đánh dấu – y chưa đánh dấu – Độ dài cạnh (x, y) ngắn • Đánh dấu y Cây khung nhỏ nhất Thuật tốn Jarnik – Prim Bước 1: Chọn đỉnh x0 và đưa vào cây  (đánh dấu x0) Bước 2: Lần lượt nạp (n-1) đỉnh cịn lại (tương  ứng n‐1 cạnh ) vào cây bằng cách:  • Chọn cạnh (x, y) thỏa điều kiện: – x thuộc cây (x đã đánh dấu) – y chưa thuộc cây (y chưa đánh dấu) – Độ dài cạnh (x, y) nhỏ • Đánh dấu y Cây khung nhỏ nhất Ví dụ: Dùng thuật tốn Prim để  m cây khung  nhỏ nhất của đồ thị sau: C 6 B H G D F 5 J E I K A Cây khung nhỏ nhất void Jarnik_Prim() { } Cây khung nhỏ nhất Bài tốn “Tìm cây khung lớn nhất” Cách 1:  • Đổi dấu các cạnh của đồ thị  • Áp dụng thuật tốn Kruskal hay Prim Cách 2: Chỉnh sửa thuật tốn Kruskal hay Prim bằng  cách Chọn cạnh lớn trước, cạnh nhỏ sau Tóm tắt chương 6

Ngày đăng: 30/08/2023, 14:22