1. Trang chủ
  2. » Thể loại khác

Slide bài giảng Toán rời rạc 2 – Ngô Xuân Bách

25 234 2

Đ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

Nội dung

Học viện Cơng nghệ Bưu Viễn thơng Khoa Cơng nghệ thơng tin Tốn rời rạc Cây Cây khung đồ thị Ngô Xuân Bách Nội dung Cây tính chất Cây khung đồ thị Bài toán khung nhỏ    http://www.ptit.edu.vn Định nghĩa ví dụ Định nghĩa 1: Ta gọi đồ thị vô hướng, liên thơng, khơng có chu trình Định nghĩa 2: Ta gọi rừng đồ thị vơ hướng, khơng có chu trình   o Như rừng đồ thị mà thành phần liên thơng Ví dụ: rừng có  (Phương ND, 2013) http://www.ptit.edu.vn Các tính chất Định lý: Giả sử 𝑇 =< 𝑉, 𝐸 > đồ thị vơ hướng 𝑛 đỉnh, khẳng định sau tương đương:  1) 2) 3) 4) 5) 6) 𝑇 𝑇 khơng có chu trình có 𝑛 − cạnh 𝑇 liên thơng có 𝑛 − cạnh 𝑇 liên thơng cạnh cầu Giữa hai đỉnh 𝑇 nối với đường đơn 𝑇 không chứa chu trình thêm vào cạnh ta thu chu trình Chứng minh: Theo sơ đồ (1) ⇒ (2) ⇒ (3) ⇒ (4) ⇒ (5) ⇒ (6) ⇒ (1)  http://www.ptit.edu.vn Nội dung Cây tính chất Cây khung đồ thị Bài toán khung nhỏ    http://www.ptit.edu.vn Định nghĩa ví dụ Định nghĩa 3: Cho 𝐺 đồ thị vô hướng liên thông Ta gọi đồ thị 𝑇 𝐺 khung 𝐺 (Cây bao trùm) 𝑇 thoả mãn hai điều kiện:  o o 𝑇 Tập đỉnh 𝑇 tập đỉnh 𝐺 Ví dụ:  http://www.ptit.edu.vn Xây dựng khung đồ thị  Bài tốn: Cho đồ thị vơ hướng 𝐺 =< 𝑉, 𝐸 > Hãy xây dựng khung đồ thị bắt đầu đỉnh 𝑢 ∈ 𝑉  Cách làm o o Sử dụng thuật toán duyệt DFS BFS Mỗi ta đến đỉnh 𝑣 tức (𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣- = 𝑡𝑟𝑢𝑒) từ đỉnh 𝑢 cạnh (𝑢, 𝑣) kết nạp vào khung http://www.ptit.edu.vn Xây dựng khung đồ thị sử dụng thuật toán DFS (1/2) Thuật toán tạo khung từ đỉnh 𝒖 Tree-DFS(𝑢){ cℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑓𝑎𝑙𝑠𝑒; //đánh dấu đỉnh 𝑢 duyệt for(𝑣 ∈ 𝐾𝑒(𝑢)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣-){ //nếu 𝑣 chưa duyệt 𝑇 = 𝑇 ∪ * 𝑢, 𝑣 +; //hợp cạnh (u, 𝑣) vào khung Tree-DFS(𝑣); //duyệt theo chiều sâu từ 𝑣 } } } http://www.ptit.edu.vn Xây dựng khung đồ thị sử dụng thuật toán DFS (2/2) Thuật toán xây dựng khung Tree-Graph-DFS( ){ //Khởi tạo đỉnh chưa xét for(𝑢 ∈ 𝑉) cℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑡𝑟𝑢𝑒; 𝑟𝑜𝑜𝑡 = < đỉ𝑛ℎ 𝑏ấ𝑡 𝑘ỳ 𝑐ủ𝑎 đồ 𝑡ℎị >; //Lấy đỉnh làm gốc 𝑇 = ∅; //Cây ban đầu chưa có cạnh Tree-DFS(root); //Gọi thuật toán tạo khung từ đỉnh if( 𝑇 < 𝑛 − 1) ; else ; } http://www.ptit.edu.vn Kiểm nghiệm thuật toán (1/2)  Cho đồ thị vô hướng biểu diễn ma trận kề hình bên Áp dụng thuật tốn xây dựng khung đồ thị sử dụng DFS cho đồ thị đỉnh 𝑢 = (Phương ND, 2013) 10 http://www.ptit.edu.vn Kiểm nghiệm thuật toán (2/2) Bước 10 11 12 13 11 Ngăn xếp đỉnh theo thứ tự gọi Tree-DFS(u) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 𝑻 𝑇 𝑇 𝑇 𝑇 =∅ = 𝑇 ∪ *(1,2)+ = 𝑇 ∪ *(2,3)+ = 𝑇 ∪ *(3,4)+ 𝑇 = 𝑇 ∪ *(3,5)+ 5, 𝑇 = 𝑇 ∪ *(5,6)+ 5, 6, 𝑇 = 𝑇 ∪ *(6,7)+ 5, 6, 7, 𝑇 = 𝑇 ∪ *(7,8)+ 5, 6, 7, 8, 𝑇 = 𝑇 ∪ *(8,9)+ 5, 6, 7, 8, 9, 10 𝑇 = 𝑇 ∪ *(9,10)+ 5, 6, 7, 8, 9, 10, 11 𝑇 = 𝑇 ∪ *(10,11)+ 5, 6, 7, 8, 9, 10, 11, 12 𝑇 = 𝑇 ∪ *(11,12)+ 5, 6, 7, 8, 9, 10, 11, 12, 13 𝑇 = 𝑇 ∪ *(12,13)+ Không thêm cạnh vào 𝑇 𝑇 = * 1,2 , 2,3 , 3,4 , 3,5 , 5,6 , 6,7 , 7,8 , 8,9 , 9,10 , 10,11 , (11,12, (12,13))+ http://www.ptit.edu.vn Xây dựng khung đồ thị sử dụng thuật toán BFS Tree-BFS(𝑢){ Bước 1: Khởi tạo T = ∅; 𝑞𝑢𝑒𝑢𝑒 = ∅; p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑢); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑓𝑎𝑙𝑠𝑒; Bước 2: Lặp while(𝑞𝑢𝑒𝑢𝑒 ≠ ∅){ 𝑠 = p𝑜𝑝(𝑞𝑢𝑒𝑢𝑒); for(𝑡 ∈ 𝐾𝑒(𝑠)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡-){ p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑡); T = T ∪ * 𝑠, 𝑡 +; 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡- = 𝑓𝑎𝑙𝑠𝑒; } } } Bước 3: Trả lại kết if( 𝑇 < 𝑛 − 1) ; else ; } 12 http://www.ptit.edu.vn Kiểm nghiệm thuật toán (1/2)  Cho đồ thị vô hướng biểu diễn ma trận kề hình bên Áp dụng thuật tốn xây dựng khung đồ thị sử dụng BFS cho đồ thị đỉnh 𝑢 = (Phương ND, 2013) 13 http://www.ptit.edu.vn Kiểm nghiệm thuật toán (2/2) Bước 10 11 12 13 14 Trạng thái hàng đợi 𝑻 𝑇=∅ 2, 3, 𝑇 = 𝑇 ∪ * 1,2 , 1,3 , (1,4)+ 3, 4, 𝑇 = 𝑇 ∪ *(3,5)+ 6, 7, 8, 𝑇 = 𝑇 ∪ * 5,6 , 5,7 , 5,8 , (5,9)+ 7, 8, 8, 9 10 𝑇 = 𝑇 ∪ *(9,10)+ 11, 12, 13 𝑇 = 𝑇 ∪ * 10,11 , 10,12 , (10,13)+ 12, 13 13 ∅ 𝑇 = * 1,2 , 1,3 , 1,4 , 3,5 , 5,6 , 5,7 , 5,8 , 5,9 , 9,10 , 10,11 , (10,12, (10,13))+ http://www.ptit.edu.vn Nội dung    Cây tính chất Cây khung đồ thị Bài toán khung nhỏ 15 http://www.ptit.edu.vn Phát biểu toán    Cho 𝐺 =< 𝑉, 𝐸 > đồ thị vô hướng liên thông với tập đỉnh 𝑉 tập cạnh 𝐸 Mỗi cạnh 𝑒 đồ thị gán với số không âm 𝑐(𝑒) gọi độ dài cạnh Giả sử 𝐻 =< 𝑉, 𝑇 > khung đồ thị 𝐺 Ta gọi độ dài 𝑐(𝐻) khung 𝐻 tổng độ dài cạnh: 𝑐 𝐻 = 𝑒∈𝑇 𝑐(𝑒) Bài toán: Trong số khung đồ thị tìm khung có độ dài nhỏ 16 http://www.ptit.edu.vn Ví dụ  Bài tốn nối mạng máy tính o  Một mạng máy tính gồm 𝑛 máy tính đánh số từ 1, 2, , 𝑛 Biết chi phí nối máy 𝑖 với máy 𝑗 𝑐,𝑖, 𝑗-, 𝑖, 𝑗 = 1, 2, , 𝑛 Hãy tìm cách nối mạng cho chi phí nhỏ Bài tốn xây dựng hệ thống cáp o 17 Giả sử ta muốn xây dựng hệ thống cáp điện thoại nối 𝑛 điểm mạng viễn thông cho điểm mạng có đường truyền tin tới điểm khác Biết chi phí xây dựng hệ thống cáp từ điểm 𝑖 đến điểm 𝑗 𝑐,𝑖, 𝑗- Hãy tìm cách xây dựng hệ thống mạng cáp cho chi phí nhỏ http://www.ptit.edu.vn Thuật tốn Kruskal (1/2)  Thêm dần cạnh vào khung  Mỗi bước chọn cạnh có trọng số nhỏ chưa nằm khung o  Nếu việc thêm cạnh vào khung khơng tạo thành chu trình thêm cạnh vào Thuật toán dừng lại o o 18 Cây khung có đủ (𝑛 − 1) cạnh, Hoặc khơng cạnh chưa nằm khung http://www.ptit.edu.vn Thuật toán Kruskal (2/2) Kruskal( ){ Bước (khởi tạo): 𝑇 = ∅; //Ban đầu tập cạnh khung rỗng 𝑑 𝐻 = 0; //Ban đầu độ dài khung Bước (sắp xếp): ; Bước (lặp): while(|𝑇| < 𝑛 − && 𝐸 ≠ ∅ ){ 𝑒 = ; 𝐸 = 𝐸\*𝑒+; //Loại cạnh 𝑒 khỏi tập cạnh if (𝑇 ∪ *𝑒+ không tạo nên chu trình ){ T = 𝑇 ∪ *𝑒+; //Đưa 𝑒 vào khung 𝑑 𝐻 = 𝑑 𝐻 + 𝑑(𝑒); //cập nhật độ dài khung } } Bước (trả lại kết quả): if(|𝑇| < 𝑛 − 1) ; else return (T, d(H)); } 19 http://www.ptit.edu.vn Kiểm nghiệm thuật toán  Áp dụng thuật toán Kruskal tìm khung nhỏ cho đồ thị biểu diễn ma trận trọng số hình bên ? (Phương ND, 2013) 20 http://www.ptit.edu.vn Thuật toán Prim (1/2)  Duy trì hai tập đỉnh 𝑉𝐻 (tập đỉnh khung) 𝑉 (tập đỉnh chưa nằm khung) o o  Mỗi bước chọn cạnh có trọng số nhỏ có đỉnh 𝑉𝐻 đỉnh 𝑉 o o  Ban đầu 𝑉𝐻 = 𝑠 , 𝑠 đỉnh đồ thị 𝑉 tập đỉnh đồ thị trừ 𝑠 Đưa cạnh vào khung Đưa đỉnh liền kề với cạnh từ 𝑉 sang 𝑉𝐻 Thuật tốn dừng lại o o 21 Cây khung có đủ (𝑛 − 1) cạnh, Hoặc khơng đỉnh 𝑉 http://www.ptit.edu.vn Thuật toán Prim (2/2) Prim( s){ Bước (khởi tạo): 𝑉𝐻 = *𝑠+; //Ban đầu 𝑉𝐻 chứa 𝑠 𝑉 = 𝑉\*𝑠+; //Loại 𝑠 khỏi 𝑉 𝑇 = ∅; //Cây khung ban đầu chưa có cạnh 𝑑 𝐻 = 0; //Độ dài khung ban đầu Bước (lặp): while(V ≠ ∅ ){ 𝑒 = (𝑢, 𝑣); //Cạnh có độ dài nhỏ với 𝑢 ∈ 𝑉, v ∈ 𝑉𝐻 T = 𝑇 ∪ *𝑒+; //Đưa 𝑒 vào khung 𝑑 𝐻 = 𝑑 𝐻 + 𝑑(𝑒); //Cập nhật độ dài khung 𝑉𝐻 = 𝑉𝐻 ∪ *𝑢+; //Đưa 𝑢 vào 𝑉𝐻 V = V\ 𝑢 ; //Loại 𝑢 khỏi 𝑉 } Bước (trả lại kết quả): if(|𝑇| < 𝑛 − 1) ; else return (T, d(H)); } 22 http://www.ptit.edu.vn Kiểm nghiệm thuật toán  Áp dụng thuật tốn Prim tìm khung nhỏ cho đồ thị biểu diễn ma trận trọng số hình bên ? (Phương ND, 2013) 23 http://www.ptit.edu.vn Tóm tắt   Khái niệm cây, tính chất Cây khung đồ thị o o  Mọi đồ thị vơ hướng liên thơng có khung Xây dựng khung đồ thị sử dụng thuật toán BFS DFS Bài toán khung nhỏ o 24 Thuật toán Kruskal thuật toán Prim http://www.ptit.edu.vn Bài tập  Làm số tập giáo trình 25 http://www.ptit.edu.vn ... ND, 20 13) 10 http://www.ptit.edu.vn Kiểm nghiệm thuật toán (2/ 2) Bước 10 11 12 13 11 Ngăn xếp đỉnh theo thứ tự gọi Tree-DFS(u) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ... 9, 10, 11, 12

Ngày đăng: 23/11/2017, 18:29

TỪ KHÓA LIÊN QUAN