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

32 619 17

Đ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 1,12 MB

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 Tìm kiếm đồ thị Ngơ Xn Bách Nội dung Thuật tốn tìm kiếm theo chiều sâu (Depth-First Search) - DFS) Thuật tốn tìm kiếm theo chiều rộng (Breadth-First Search - BFS) Một số ứng dụng DFS BFS    http://www.ptit.edu.vn Tìm kiếm theo chiều sâu - DFS Tư tưởng  o o Trong trình tìm kiếm, ưu tiên “chiều sâu” “chiều rộng” Đi xuống sâu trước quay lại Thuật tốn  DFS(𝑢){ //𝑢 đỉnh bắt đầu duyệt ; //duyệt đỉnh 𝑢 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑓𝑎𝑙𝑠𝑒; //xác nhận đỉnh 𝑢 duyệt for(𝑣 ∈ 𝐾𝑒(𝑢)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣-) //nếu 𝑣 chưa duyệt DFS(𝑣); //duyệt theo chiều sâu từ 𝑣 } } http://www.ptit.edu.vn DFS sử dụng ngăn xếp DFS(𝑢){ Bước 1: Khởi tạo 𝑠𝑡𝑎𝑐𝑘 = ∅; //khởi tạo 𝑠𝑡𝑎𝑐𝑘 ∅ p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑢); //đưa đỉnh 𝑢 vào ngăn xếp ; //duyệt đỉnh 𝑢 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑓𝑎𝑙𝑠𝑒; //xác nhận đỉnh 𝑢 duyệt Bước 2: Lặp while(𝑠𝑡𝑎𝑐𝑘 ≠ ∅){ 𝑠 = p𝑜𝑝(𝑠𝑡𝑎𝑐𝑘); //lấy đỉnh đầu ngăn xếp for(𝑡 ∈ 𝐾𝑒(𝑠)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡-){ //nếu 𝑡 chưa duyệt ; //duyệt đỉnh 𝑡 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡- = 𝑓𝑎𝑙𝑠𝑒; //𝑡 duyệt p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑠); //đưa 𝑠 vào ngăn xếp p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑡); //đưa 𝑡 vào ngăn xếp beak; //chỉ lấy đỉnh 𝑡 } } } Bước 3: Trả lại kết return ; }4 http://www.ptit.edu.vn Độ phức tạp thuật toán DFS  Độ phức tạp thuật toán DFS(𝑢) phụ thuộc vào phương pháp biểu diễn đồ thị  Biểu diễn đồ thị ma trận kề o Độ phức tạp thuật toán 𝑂(𝑛2 ), 𝑛 số đỉnh Biểu diễn đồ thị danh sách cạnh  o Độ phức tạp thuật toán 𝑂(𝑛 𝑚), 𝑛 số đỉnh, 𝑚 số cạnh Biểu diễn đồ thị danh sách kề  o Độ phức tạp thuật toán 𝑂(max(𝑛, 𝑚)), 𝑛 số đỉnh, 𝑚 số cạnh http://www.ptit.edu.vn Kiểm nghiệm thuật toán DFS (1/2) Ví dụ 1: Cho đồ thị gồm 13 đỉnh hình vẽ Hãy kiểm nghiệm thuật tốn DFS(1)  (Phương ND, 2013) http://www.ptit.edu.vn Kiểm nghiệm thuật toán DFS (2/2) STT Trạng thái ngăn xếp 10 11 12 13 14 15 16- 1, 1, 2, 1, 2, 4, 1, 2, 1, 2, 4, 1, 2, 4, 6, 1, 2, 4, 1, 2, 4, 6, 1, 2, 4, 6, 8, 10 1, 2, 4, 6, 8, 10, 1, 2, 4, 6, 8, 10, 5, 1, 2, 4, 6, 8, 10, 5, 9, 13 1, 2, 4, 6, 8, 10, 5, 9, 13, 11 1, 2, 4, 6, 8, 10, 5, 9, 13, 11, 12 Lần lượt bỏ đỉnh khỏi ngăn xếp Danh sách đỉnh duyệt 1, 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, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 10 10, 10, 5, 10, 5, 10, 5, 10, 5, 9, 13 9, 13, 11 9, 13, 11, 12 Kết duyệt: 1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12 http://www.ptit.edu.vn Bài tập Cho đồ thị gồm 13 đỉnh biểu diễn dạng ma trận kề hình vẽ Hãy cho biết kết thực thuật toán DFS(1) Chỉ rõ trạng thái ngăn xếp tập đỉnh duyệt theo bước thực thuật toán  (Phương ND, 2013) http://www.ptit.edu.vn Nội dung Thuật tốn tìm kiếm theo chiều sâu (Depth-First Search) - DFS) Thuật tốn tìm kiếm theo chiều rộng (Breadth-First Search - BFS) Một số ứng dụng DFS BFS    http://www.ptit.edu.vn Tìm kiếm theo chiều rộng - BFS  Tư tưởng o o  Trong trình tìm kiếm, ưu tiên “chiều rộng” “chiều sâu” Tìm kiếm xung quanh trước xuống sâu Thuật toán BFS(𝑢){ Bước 1: Khởi tạo 𝑞𝑢𝑒𝑢𝑒 = ∅; p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑢); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑓𝑎𝑙𝑠𝑒; Bước 2: Lặp while(𝑞𝑢𝑒𝑢𝑒 ≠ ∅){ 𝑠 = p𝑜𝑝(𝑞𝑢𝑒𝑢𝑒); ; for(𝑡 ∈ 𝐾𝑒(𝑠)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡-){ p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑡); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑡- = 𝑓𝑎𝑙𝑠𝑒; } } } Bước 3: Trả lại kết return ; } 10 http://www.ptit.edu.vn Tìm đường đỉnh đồ thị (1/4)  Phát biểu toán o  Cho đồ thị 𝐺 =< 𝑉, 𝐸 > (vơ hướng có hướng), 𝑉 tập đỉnh, 𝐸 tập cạnh Hãy tìm đường từ 𝑠 ∈ 𝑉 đến 𝑡 ∈ 𝑉? Mơ tả thuật tốn o o Nếu 𝑡 ∈ 𝐷𝐹𝑆(𝑠) 𝑡 ∈ 𝐵𝐹𝑆(𝑠) ta kết luận có đường từ 𝑠 đến 𝑡 đồ thị, ngược lại khơng có đường Để ghi nhận đường ta sử dụng mảng 𝑡𝑟𝑢𝑜𝑐,- gồm 𝑛 phần tử (𝑛 = |𝑉|)    18 Khởi tạo ban đầu 𝑡𝑟𝑢𝑜𝑐 𝑢 = với 𝑢 Mỗi đưa 𝑣 ∈ 𝐾𝑒(𝑢) vào ngăn xếp (nếu sử dụng 𝐷𝐹𝑆) hàng đợi (nếu sử dụng 𝐵𝐹𝑆) ta ghi nhận 𝑡𝑟𝑢𝑜𝑐 𝑣 = 𝑢 Nếu 𝐷𝐹𝑆 𝐵𝐹𝑆 khơng duyệt đến đỉnh 𝑡, 𝑡𝑟𝑢𝑜𝑐,𝑡- = ta kết luận khơng có đường từ 𝑠 đến 𝑡 http://www.ptit.edu.vn Tìm đường đỉnh đồ thị (2/4) Sử dụng thuật toán DFS DFS(𝑠){ Bước 1: Khởi tạo 𝑠𝑡𝑎𝑐𝑘 = ∅; p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑠); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑠- = 𝑓𝑎𝑙𝑠𝑒; Bước 2: Lặp while(𝑠𝑡𝑎𝑐𝑘 ≠ ∅){ 𝑢 = p𝑜𝑝(𝑠𝑡𝑎𝑐𝑘); //lấy đỉnh ngăn xếp for(𝑣 ∈ 𝐾𝑒(𝑢)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣-){ //nếu 𝑣 chưa duyệt 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣- = 𝑓𝑎𝑙𝑠𝑒; //𝑣 duyệt p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑢); //đưa 𝑢 vào ngăn xếp p𝑢𝑠ℎ(𝑠𝑡𝑎𝑐𝑘, 𝑣); //đưa 𝑣 vào ngăn xếp 𝒕𝒓𝒖𝒐𝒄,𝒗- = 𝒖; //Ghi nhận 𝑡𝑟𝑢𝑜𝑐,𝑣- 𝑢 beak; //chỉ lấy đỉnh 𝑡 } } } Bước 3: Trả lại kết return ; } 19 http://www.ptit.edu.vn Tìm đường đỉnh đồ thị (3/4) Sử dụng thuật toán BFS BFS(𝑢){ Bước 1: Khởi tạo 𝑞𝑢𝑒𝑢𝑒 = ∅; p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑠); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑠- = 𝑓𝑎𝑙𝑠𝑒; Bước 2: Lặp while(𝑞𝑢𝑒𝑢𝑒 ≠ ∅){ 𝑢 = p𝑜𝑝(𝑞𝑢𝑒𝑢𝑒); for(𝑣 ∈ 𝐾𝑒(𝑢)){ if( 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣-){ p𝑢𝑠ℎ(𝑞𝑢𝑒𝑢𝑒, 𝑣); 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑣- = 𝑓𝑎𝑙𝑠𝑒; 𝒕𝒓𝒖𝒐𝒄 𝒗 = 𝒖; } } } Bước 3: Trả lại kết return ; } 20 http://www.ptit.edu.vn Tìm đường đỉnh đồ thị (4/4) Ghi nhận đường Ghi-Nhan-Duong-Di(𝑠, 𝑡){ if( 𝑡𝑟𝑢𝑜𝑐 𝑡 == 0){ ; } else{ ; // Đưa đỉnh t trước u = 𝑡𝑟𝑢𝑜𝑐 𝑡 ; // u đỉnh trước đến t while(𝑢 ≠ 𝑠){ ; u = 𝑡𝑟𝑢𝑜𝑐 𝑢 ; // lần ngược lại đỉnh trước u } ; } } 21 http://www.ptit.edu.vn Bài tập  Cho đồ thị gồm 13 đỉnh biểu diễn dạng ma trận kề hình vẽ Tìm đường từ đỉnh đến đỉnh 13 đồ thị ? (Phương ND, 2013) 22 http://www.ptit.edu.vn Tính liên thơng mạnh đồ thị có hướng  Phát biểu tốn o  Đồ thị có hướng 𝐺 =< 𝑉, 𝐸 > liên thông mạnh hai đỉnh tồn đường Cho trước đồ thị có hướng 𝐺 = < 𝑉, 𝐸 > Kiểm tra xem 𝐺 có liên thơng mạnh hay khơng? Thuật tốn bool Strong_Connected (𝐺 =< 𝑉, 𝐸 >){ //kt tính liên thơng mạnh G 𝑅𝑒𝐼𝑛𝑖𝑡( ); // ∀𝑢 ∈ 𝑉: 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑡𝑟𝑢𝑒; for(𝑢 ∈ 𝑉){ //lặp tập đỉnh if(𝑩𝑭𝑺(𝒖) ≠ 𝑉) // kiểm tra 𝑫𝑭𝑺 𝒖 ≠ 𝑉 return false; // đồ thị không liên thông mạnh else 𝑅𝑒𝐼𝑛𝑖𝑡(); // khởi tạo lại mảng 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,} return true; // đồ thị liên thông mạnh } 23 http://www.ptit.edu.vn Bài tập  Cho đồ thị có hướng 𝐺 =< 𝑉, 𝐸 > biểu diễn dạng ma trận kề hình bên Xác định xem 𝐺 có liên thơng mạnh hay khơng? (Phương ND, 2013) 24 http://www.ptit.edu.vn Duyệt đỉnh trụ  Phát biểu toán o  Đỉnh 𝑢 ∈ 𝑉 đồ thị vô hướng 𝐺 =< 𝑉, 𝐸 > gọi trụ loại bỏ đỉnh 𝑢 với cạnh nối với 𝑢 làm tăng thành phần liên thông 𝐺 Cho trước đồ thị vô hướng (liên thơng) 𝐺 =< 𝑉, 𝐸 >, tìm đỉnh trụ 𝐺? Thuật toán Duyet_Tru (𝐺 =< 𝑉, 𝐸 >){ 𝑅𝑒𝐼𝑛𝑖𝑡( ); // ∀𝑢 ∈ 𝑉: 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑡𝑟𝑢𝑒; for(𝑢 ∈ 𝑉){ //lấy đỉnh 𝑢 𝑐ℎ𝑢𝑎𝑥𝑒𝑡 𝑢 = 𝑓𝑎𝑙𝑠𝑒; // cấm BFS DFS duyệt 𝑢 if(𝑩𝑭𝑺(𝒗) ≠ 𝑉\*u+) // kiểm tra 𝑫𝑭𝑺 𝒗 ≠ 𝑉\*u+ ; 𝑅𝑒𝐼𝑛𝑖𝑡(); // khởi tạo lại mảng 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,} } 25 http://www.ptit.edu.vn Bài tập  Cho đồ thị vô hướng 𝐺 =< 𝑉, 𝐸 > biểu diễn dạng ma trận kề hình bên Tìm đỉnh trụ 𝐺? (Phương ND, 2013) 26 http://www.ptit.edu.vn Duyệt cạnh cầu  Phát biểu toán   Cạnh 𝑒 ∈ 𝐸 đồ thị vô hướng 𝐺 =< 𝑉, 𝐸 > gọi cạnh cầu loại bỏ 𝑒 làm tăng thành phần liên thông 𝐺 Cho trước đồ thị vô hướng (liên thơng) 𝐺 =< 𝑉, 𝐸 >, tìm cạnh cầu 𝐺? Thuật toán Duyet_Cau (𝐺 =< 𝑉, 𝐸 >){ 𝑅𝑒𝐼𝑛𝑖𝑡( ); // ∀𝑢 ∈ 𝑉: 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,𝑢- = 𝑡𝑟𝑢𝑒; for(𝑒 ∈ 𝐸){ //lấy cạnh đồ thị 𝐸 = 𝐸 \ *𝑒+; // loại bỏ cạnh 𝑒 khỏi đồ thị if(𝑩𝑭𝑺(𝟏) ≠ 𝑉) // kiểm tra 𝑫𝑭𝑺 𝟏 ≠ 𝑉 ; 𝐸 = 𝐸 ∪ *𝑒+; // hoàn trả lại cạnh 𝑒 𝑅𝑒𝐼𝑛𝑖𝑡(); // khởi tạo lại mảng 𝑐ℎ𝑢𝑎𝑥𝑒𝑡,} } 27 http://www.ptit.edu.vn Bài tập  Cho đồ thị vô hướng 𝐺 =< 𝑉, 𝐸 > biểu diễn dạng ma trận kề hình bên Tìm cạnh cầu 𝐺? (Phương ND, 2013) 28 http://www.ptit.edu.vn Bài toán định chiều đồ thị (1/2)  Định nghĩa o o  Phép định chiều đồ thị vô hướng liên thông phép biến đổi đồ thị vô hướng liên thông thành đồ thị có hướng liên thơng mạnh Đồ thị vơ hướng 𝐺 =< 𝑉, 𝐸 > gọi đồ thị định chiều dịch chuyển thành đồ thị có hướng liên thơng mạnh cách định chiều cạnh vơ hướng thành cung có hướng Ví dụ (Phương ND, 2013) 29 http://www.ptit.edu.vn Bài tốn định chiều đồ thị (2/2)  Định lý o  Đồ thị vô hướng liên thông 𝐺 =< 𝑉, 𝐸 > định chiều tất cạnh 𝑒 ∈ 𝐸 𝐺 cầu Một số vấn đề cần quan tâm o o o 30 Chứng minh đồ thị vô hướng định chiều Viết chương trình kiểm tra đồ thị vơ hướng có định chiều hay khơng? Chỉ phép định chiều đồ thị vô hướng http://www.ptit.edu.vn Tóm tắt    Thuật tốn duyệt theo chiều sâu bắt đầu đỉnh 𝑢 ∈ 𝑉, 𝐷𝐹𝑆(𝑢) Thuật toán duyệt theo chiều rộng bắt đầu đỉnh 𝑢 ∈ 𝑉, 𝐵𝐹𝑆(𝑢) Ứng dụng thuật toán 𝐷𝐹𝑆(𝑢) 𝐵𝐹𝑆(𝑢) o o o o o o o 31 Duyệt tất đỉnh đồ thị Duyệt tất thành phần liên thông đồ thị Tìm đường từ đỉnh 𝑠 đến đỉnh 𝑡 đồ thị Kiểm tra tính liên thơng mạnh đồ thị Duyệt đỉnh trụ đồ thị Duyệt cạnh cầu đồ thị Kiểm tra đồ thị có định chiều hay khơng http://www.ptit.edu.vn Bài tập  Làm số tập giáo trình 32 http://www.ptit.edu.vn ... thái hàng đợi 2, 3, 3, 4, 4, 6, 6, 5, 5, 7, 12 7, 12, 12, 8, 10 10 9, 11, 13 11, 13 13 ∅ Danh sách đỉnh duyệt ∅ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,... khỏi ngăn xếp Danh sách đỉnh duyệt 1, 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, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 6, 6,... thuật toán DFS(1)  (Phương ND, 20 13) http://www.ptit.edu.vn Kiểm nghiệm thuật toán DFS (2/ 2) STT Trạng thái ngăn xếp 10 11 12 13 14 15 16- 1, 1, 2, 1, 2, 4, 1, 2, 1, 2, 4, 1, 2, 4, 6, 1, 2, 4,

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

TỪ KHÓA LIÊN QUAN