Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 173 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
173
Dung lượng
6,33 MB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA CƠNG NGHỆ THÔNG TIN -& BÀI GIẢNG THUẬT TOÁN VÀ ỨNG DỤNG Biên soạn :TS ĐỖ THỊ BÍCH NGỌC TS TRẦN QUÍ NAM TS NGUYỄN DUY PHƯƠNG Hà Nội, tháng 12/2019 LỜI NÓI ĐẦU Thuật tốn thủ tục hay trình tự thực cơng việc máy tính định nghĩa rõ ràng, nhận vào giá trị tập giá trị (gọi input) sinh giá trị tập giá trị (gọi output) Có thể hiểu thuật toán đồ, dẫn để hồn thành cơng việc Thuật tốn quan trọng tất lĩnh vực khác khoa học máy tính Một máy tính có tốc độ cao hay tốc độ thấp, hệ điều hành thực ổn định hay không ổn định, ứng dụng chạy nhanh hay chạy chậm tất phụ thuộc vào thuật tốn cài đặt cơng nghệ, hệ điều hành phần mềm Càng nhiều vấn đề giải có nhiều thuật tốn Thơng qua việc hiểu biết thuật tốn người học có khả lựa chọn giải pháp hợp lý cho vấn đề cần giải áp dụng cách xác Tài liệu giảng dạy thuật tốn ứng dụng xây dựng dành cho sinh viên năm thứ ba ngành công nghệ thông tin tổ chức thành 11 chương Trong chương trình bày số vấn đề liên quan đến thuật toán, độ phức tạp thuật tốn, độ phức tạp chương trình độ phức tạp cấu trúc lệnh Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn sinh Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn đệ qui quay lui Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn tham lam Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn chia trị Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn qui hoạch động Chương trình bày kỹ nâng cao giải tốn mơ hình thuật tốn xếp tìm kiếm Chương trình bày kỹ nâng cao giải toán dựa vào ngăn xếp Chương trình bày kỹ nâng cao giải toán dựa vào hàng đợi Chương 10 trình bày kỹ nâng cao giải toán dựa vào nhị phân Chương 11 trình bày kỹ nâng cao giải toán dựa vào đồ thị Trong phần tài liệu, chúng tơi cố gắng trình bày ngắn gọn trực tiếp vào chất mơ hình thuật tốn nhằm đạt ba mục tiêu chính: hiểu chất mơ hình thuật tốn, giải lớp tốn dựa vào mơ hình thuật tốn, nâng cao kỹ giải vấn đề thuật toán Mặc dù cẩn trọng trình biên soạn, nhiên tài liệu khơng tránh khỏi thiếu sót hạn chế Chúng tơi mong góp ý q báu tất bạn đọc Hà Nội, tháng 12 năm 2019 MỤC LỤC LỜI NÓI ĐẦU MỤC LỤC i CHƯƠNG THUẬT TOÁN VÀ MỘT SỐ VẤN ĐỀ LIÊN QUAN 1.1 Thuật toán số vấn đề liên quan 1.2 Biểu diễn thuật toán 1.3 Độ phức tạp thuật toán 1.3.1 Khái niệm độ phức tạp thuật toán 1.3.2.Một số qui tắc xác định độ phức tạp thuật toán 1.3.3.Một số dạng hàm dùng xác định độ phức tạp thuật toán 1.4 Độ phức tạp cấu trúc lệnh 10 1.5.Qui trình giải tốn máy tính 12 CHƯƠNG MÔ HÌNH THUẬT TỐN SINH 14 2.1 Giới thiệu thuật toán sinh 14 2.2 Một số toán xử lý thuật toán sinh 16 2.3 Một số toán xử lý thuật toán sinh nâng cao 19 2.4 Một số toán xử lý thuật toán sinh tiên tiến 22 CHƯƠNG MƠ HÌNH THUẬT TỐN ĐỆ QUI & QUAY LUI 24 3.1 Mơ hình thuật tốn đệ qui 24 3.2 Mơ hình thuật toán quay lui (Back-track Algorithm) 25 3.3 Một số toán xử lý thuật toán đệ qui & quay lui 26 3.4 Một số toán xử lý thuật toán đệ qui quay lui nâng cao 31 3.5 Một số toán xử lý thuật toán đệ qui quay lui tiên tiến 34 CHƯƠNG MÔ HÌNH THUẬT TỐN THAM LAM 39 4.1 Giới thiệu mơ hình thuật tốn tham lam (Greedy Algorithm) 39 4.2 Một số toán xử lý thuật toán tham lam 43 4.3 Một số toán xử lý thuật toán tham lam nâng cao 47 4.4 Một số toán xử lý thuật toán tham lam tiên tiến 51 CHƯƠNG MƠ HÌNH THUẬT TOÁN CHIA VÀ TRỊ 55 5.1 Giới thiệu mơ hình thuật tốn chia trị (Devide and Conquer Algorithm) 55 5.2 Một số toán xử lý thuật toán chia trị 56 5.3 Một số toán xử lý thuật toán chia trị nâng cao 60 5.4 Một số toán xử lý thuật toán chia trị tiên tiến 63 CHƯƠNG MƠ HÌNH THUẬT TOÁN QUI HOẠCH ĐỘNG 68 6.1 Giới thiệu mô hình thuật tốn qui hoạch động 68 6.2 Một số toán xử lý thuật toán qui hoạch động 70 6.3 Một số toán xử lý thuật toán qui hoạch động nâng cao 77 Nguyễn Duy Phương i 6.4 Một số toán xử lý thuật toán qui hoạch động tiên tiến 81 CHƯƠNG MƠ HÌNH THUẬT TỐN SẮP XẾP VÀ TÌM KIẾM 86 7.1 Giới thiệu vấn đề 86 7.2 Một số toán xử lý thuật tốn xếp tìm kiếm 86 7.3 Một số toán xử lý thuật toán xếp tìm kiếm nâng cao 93 7.4 Một số toán xử lý thuật toán xếp tiên tiến 98 CHƯƠNG MƠ HÌNH THUẬT TỐN DỰA VÀO NGĂN XẾP 102 8.1 Giới thiệu ngăn xếp (stack) 102 8.2 Một số toán dựa vào ngăn xếp 104 8.3 Một số toán nâng cao dựa vào ngăn xếp 107 8.4 Một số toán tiên tiến dựa vào ngăn xếp 110 CHƯƠNG MÔ HÌNH THUẬT TỐN DỰA VÀO HÀNG ĐỢI 117 9.1 Giới thiệu hàng đợi (queue) 117 9.2 Một số toán dựa vào hàng đợi 118 9.3 Một số toán nâng cao dựa vào hàng đợi 120 9.4 Một số toán tiên tiến dựa vào hàng đợi 123 CHƯƠNG 10 MƠ HÌNH THUẬT TỐN DỰA VÀO CÂY NHỊ PHÂN 126 10.1 Giới thiệu nhị phân (binary tree) 126 10.2 Một số toán dựa vào nhị phân 127 10.3 Một số toán nâng cao dựa vào vào nhị phân 134 10.4 Một số toán tiên tiến dựa vào vào nhị phân 140 CHƯƠNG 11 MƠ HÌNH THUẬT TỐN DỰA VÀO ĐỒ THỊ 145 11.1 Giới thiệu đồ thị 145 11.1.1 Một số thuật ngữ đồ thị vô hướng 146 11.1.2 Một số thuật ngữ đồ thị có hướng 146 11.1.3.Một số loại đồ thị đặc biệt 147 11.1.4 Biểu diễn đồ thị 148 11.2 Một số toán dựa vào đồ thị 150 11.3 Một số toán nâng cao dựa vào đồ thị 155 11.4 Một số toán tiên tiến dựa vào đồ thị 159 TÀI LIỆU THAM KHẢO 170 Nguyễn Duy Phương ii Nguyễn Duy Phương iii Chương 1: Giới thiệu chung thuật toán ứng dụng CHƯƠNG THUẬT TOÁN VÀ MỘT SỐ VẤN ĐỀ LIÊN QUAN Nội dung chương cung cấp cho người đọc vấn đề liên quan đến thuật toán Đối với thuật toán, người học cần quan tâm đến vấn đề bản: biểu diễn thuật toán, ước lượng độ phức tạp thuật toán, cài đặt thuật toán, thử nghiệm thuật toán Tài liệu sử dụng ngơn ngữ hình thức để biểu diễn thuật toán, sử dụng độ phức tạp cấu trúc lệnh & cấu trúc liệu để ước lượng độ phức tạp thuật toán, sử dụng ngữ lập trình C++ để cài đặt thuật tốn, sử dụng phương pháp thử nghiệm dựa vào liệu để kiểm tra tính đắn thuật tốn 1.1 Thuật tốn số vấn đề liên quan Thuật toán thủ tục hay trình tự thực cơng việc máy tính định nghĩa rõ ràng, nhận vào giá trị tập giá trị (gọi input) sinh giá trị tập giá trị (gọi output) Ta tổng qt hóa khái niệm thuật tốn sau Định nghĩa thuật toán (Algorithm): Thuật toán F giải toán P dãy thao tác sơ cấp F1, F2, ,FN tập kiện đầu vào (Input) để đưa c kt qu (Output) F1F2 FN(Input) đOuput ã F = F1F2 FN gọi thuật toán giải tốn P Trong đó, Fi phép tốnsơ cấp • Input gọi tập kiện đầu vào hay tập thơng tin đầu vào • Output kết nhận sau thực thuật toán F tập Input Ví dụ Thuật tốn tìm USCLN(a, b) int USCLN ( int a, int b) {//đầu vào số nguyên a, b while (b!=0 ) {//lặp b khác x = a % b; //lấy x a mode b a = b; //đặt a b b =x; //đặt b x } return(a);//kết thực thi thuật toán } Những đặc trưng thuật tốn: • Tính đơn định Ở bước thuật toán, thao tác sơ cấp phải rõ ràng, không tạo lộn xộn, nhập nhằng, đa nghĩa Thực bước thuật toán tập liệu đầu vào cho kết Nguyễn Duy Phương Chương 1: Giới thiệu chung thuật tốn ứng dụng • Tính dừng Thuật tốn khơng rơi vào q trình vơ hạn Thuật toán phải dừng lại cho kết sau số hữu hạn bước • Tính Sau thực tất bước thuật tốn theo qui trình định, ta phải nhận kết mong muốn với liệu đầu vào Kết kiểm chứng yêu cầu tốn • Tính phổ dụng Thuật tốn phải dễ sửa đổi để thích ứng với toán lớp toán loại làm việc nhiều loại liệu khác • Tính khả thi Thuật tốn phải dễ hiểu, dễ cài đặt, thực máy tính với thời gian cho phép Đối với thuật tốn ta cần quan tâm đến vấn đề sau: • Biểu diễn thuật tốn: xác định ngơn ngữ để biểu diễn thuật tốn • Đánh giá độ phức tạp thuật tốn: ước lượng thời gian khơng gian nhớ thực thuật tốn • Kiểm nghiệm thuật tốn: kiểm nghiệm thuật toán với liệu thực khác • Cài đặt thuật tốn: cài đặt thuật tốn ngơn ngữ lập trình cụ thể 1.2 Biểu diễn thuật tốn Có ba ngơn ngữ để biểu diễn thuật tốn: ngơn ngữ tự nhiên, ngơn ngữ máy tính ngơn ngữ hình thức • Ngơn ngữ tự nhiên phương tiện giao tiếp người với người Ta sử dụng ngơn ngữ vào việc biểu diễn thuật tốn • Ngơn ngữ máy tính phương tiện giao tiếp máy tính máy tính Trong trường hợp ta sử dụng ngơn ngữ lập trình để biểu diễn thuật tốn (C, Pascal, Java…) • Ngơn ngữ hình thức Ngơn ngữ hình thức phương tiện giao tiếp trung gian người hệ thống máy tính Ví dụ ngơn ngữ sơ đồ khối, ngơn ngữ tựa tự nhiên, ngôn ngữ đặc tả Đặc điểm chung loại ngơn ngữ hình thức việc sử dụng gần gũi với ngơn ngữ tự nhiên, gần gũi với ngơn ngữ máy tính Tuy nhiên, ngơn ngữ hình thức lại khơng phụ thuộc vào ngơn ngữ tự nhiên, khơng phụ thuộc vào ngơn ngữ máy tính Chính lý này, ngơn ngữ hình thức sử dụng phổ biến biểu diễn thuật tốn Ví dụ minh họa cho ngôn ngữ biểu diễn thuật toán Nguyễn Duy Phương Chương 1: Giới thiệu chung thuật tốn ứng dụng //Ví dụ 1.3.Biểu diễn thuật tốn ngơn ngữ tự nhiên Đầu vào (Input) Hai số tự nhiên a, b Đầu (Output) Số nguyên u lớn để a b chia hết cho u Thuật toán (Euclide Algorithm): Bước Đưa vào hai số tự nhiên a b Bước Nếu b¹ chuyển đến bước 3, b=0 thực bước Bước Đặt r = a mod b; a = b; b = r ; Quay quay trở lại bước Bước (Output) Kết luận u=a số ngun cần tìm //Ví dụ 1.4.Biểu diễn thuật tốn ngơn ngữ máy tính (C++) int USCLN( int a, int b) { while ( b != ) {//lặp b khác r = a % b; //đặt r phần dư a/b a = b; // đặt a b b = r; //đặt b r } return(a);//trả lại giá trị a } //Ví dụ 1.5.Biểu diễn thuật tốn ngơn ngữ hình thức Thuật tốn Euclide: Đầu vào (Input): N, N Đầu (Output): s = max { u ÎN : a mod u =0 and b mod u =0} Format : s = Euclide (a, b) Actions : while (b ¹ ) //lặp b khác r = a mod b; //đặt r a mod b a = b; //đổi giá trị a thành b b = r;// đổi giá trị b thành r endwhile;//kết thúc cấu trúc lặp while return(a);//giá trị trả hàm Endactions Một số lưu ý biểu diễn thuật tốn ngơn ngữ hình thức: Nguyễn Duy Phương Chương 1: Giới thiệu chung thuật tốn ứng dụng • Khi biểu diễn ngơn ngữ hình thức ta phép sử dụng ngơn ngữ tự nhiên ngơn ngữ máy tính thơng dụng Mỗi bước thực thuật tốn khơng cần mơ tả chi tiết mà cần mô tả cách hình thức miễn đầy đủ thơng tin để dễ dàng chuyển đổi sang ngơn ngữ lập trình • Đối với thuật tốn phức tạp nặng nề tính tốn, cơng thức cần mơ tả cách tường minh, có ghi rõ ràng • Đối với thuật tốn kinh điển ta cần phải học thuộc Không bắt buộc phải chứng minh lại độ phức tạp thuật toán kinh điển Tuy nhiên ta sử dụng kết để chứng minh độ phức tạp cho thuật toán khác 1.3 Độ phức tạp thuật toán Một toán thực nhiều thuật tốn khác Lựa chọn giải thuật nhanh để giải tốn nhu cầu thực tế Vì ta cần phải có ước lượng cụ tốn học để xác định mức độ nhanh chậm giải thuật 1.3.1 Khái niệm độ phức tạp thuật toán Thời gian thực giải thuật chương trình máy tính phụ thuộc vào yếu tố: • Kích thước liệu đầu vào: giải thuật hay chương trình máy tính thực tập liệu có kích thước lớn hiển nhiên nhiểu thời gian thuật tốn chương trình thực tập liệu đầu vào có kích thước nhỏ • Phần cứng hệ thống máy tính: hệ thống máy tính có tốc độ cao thực nhanh hệ thống máy tính có tốc độ thấp Tuy nhiên, ta quan niệm thời gian thực thuật toán số phép toán sơ cấp thực thuật tốn phần cứng máy tính khơng cịn yếu tố ảnh hưởng đến q trình xác định thời gian thực thuật toán Với quan niệm này, độ phức tạp thời gian thực thuật tốn cịn phụ thuộc vào độ dài liệu đầu vào Gọi độ dài liệu đầu vào làT(n) Khi đó, số lượng phép toán sơ cấp để giải toán P thực theo thuật toán F=F1F2 Fn độ dài liệu T(n) F(T(n)) Để xác định số lượng phép toán sơ cấp Fi(i=1, 2, , n) thực thuật toán Fta cần phải giải toán đếm để xác định F(T(n)) Đây tốn vơ khó khơng phải lúc giải [] Để đơn giản điều này, người ta thường tìm đến phương pháp xấp xỉ để tính tốn độ phức tạp thời gian thuật toán Điều có nghĩa, ta khơng thể xây dựng cơng thức đếm F(T(n)), ta lại có khẳng định chắn F(T(n)) không vượt phiếm hàm biết trước G(n) ta nói F(T(n)) thực nhanh G(n) Tổng quát, cho hai hàm f(x), g(x) xác định tập số nguyên dương tập số thực Hàm f(x) gọi O(g(x)) tồn số C>0 n0 cho: Nguyễn Duy Phương CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG 12 Thuật toán BFS tìm số thành phần liên thơng Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Hãy tìm số thành phần liên thơng đồ thị thuật tốn BFS Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa số thành phần liên thơng đồ thị thuật tốn BFS Input: 6 21 32 33 43 54 Output: 13 Kiểm tra tính liên thơng mạnh Cho đồ thị có hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, kiểm tra xem đồ thị có liên thơng mạnh hay khơng? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa “YES”, “NO” theo dòng tương ứng với test liên thông mạnh không liên thông mạnh Input: 22 43 13 23 54 35 45 6 Output: YES 14 Kiểm tra tính liên thơng mạnh Cho đồ thị có hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, kiểm tra xem đồ thị có liên thơng mạnh hay khơng? Input: • Dòng đưa vào T số lượng test Nguyễn Duy Phương 156 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa “YES”, “NO” theo dòng tương ứng với test liên thông mạnh không liên thông mạnh Input: 2 3 23 54 35 45 66 Output: YES 15 Đỉnh trụ Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, đưa tất đỉnh trụ đồ thị? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách đỉnh trụ test theo dòng Input: 1 32 53 Output: 16 Đỉnh trụ Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, đưa tất đỉnh trụ đồ thị? Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách đỉnh trụ test theo dòng Input: Output: Nguyễn Duy Phương 157 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG 32 32 53 17 Cạnh cầu Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, đưa tất cạnh cầu đồ thị? Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách cạch cầu test theo dòng Input: 1 32 32 53 Output: 18 Cạnh cầu Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, đưa tất cạnh cầu đồ thị? Input: • Dòng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách cạch cầu test theo dòng Input: 1 3 Output: 19 Cây khung Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, xây dựng khung đồ thị bắt đầu đỉnh V? Nguyễn Duy Phương 158 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào ba số |V|, |E|, u tương ứng với số đỉnh, số cạnh đỉnh V; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách cạch khung đồ thị bắt đầu đỉnh u test theo dòng; đưa -1 đồ thị khơng có khung? Input: 1 95 21 32 32 53 43 54 54 65 Output: 2 1 3 4 20 Cây khung Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, xây dựng khung đồ thị bắt đầu ti nh uẻV? Input: ã Dũng u tiờn a vo T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào ba số |V|, |E|, u tương ứng với số đỉnh, số cạnh đỉnh V; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách cạch khung đồ thị bắt đầu đỉnh u test theo dòng; đưa -1 đồ thị khơng có khung? Input: 21 32 32 53 43 54 54 65 Output: 5 5 11.4 Một số toán tiên tiến dựa vào đồ thị Dưới số tốn tiên tiến dựa vào đồ thị: 21 Chu trình đồ thị vô hướng Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, kiểm tra xem đồ thị có tồn chu trình hay khơng? Nguyễn Duy Phương 159 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG Input: • Dòng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn không tồn chu trình Input: 21 32 32 53 43 54 54 65 Output: YES 22 Chu trình đồ thị vơ hướng Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, kiểm tra xem đồ thị có tồn chu trình hay khơng? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dịng dịng đưa vào đơi V, vẻV tng ng vi mt cnh ca th ã T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn khơng tồn chu trình Input: 21 32 32 53 43 54 54 65 Output: YES 23 Chu trình đồ thị vơ hướng Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán Union Set, kiểm tra xem đồ thị có tồn chu trình hay khơng? Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| Nguyễn Duy Phương 160 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn khơng tồn chu trình Input: 21 32 32 53 43 54 54 65 Output: YES 24 Chu trình đồ thị vô hướng Cho đồ thị vô hướng G= biểu diễn dạng danh sách cạnh Sử dụng Disjoin Set, kiểm tra xem đồ thị có tồn chu trình hay khơng? Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn không tồn chu trình Input: 21 32 32 53 43 54 54 65 Output: YES 25 Chu trình đồ thị có hướng Cho đồ thị có hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán DFS, kiểm tra xem đồ thị có tồn chu trình hay khơng? Input: • Dòng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: Nguyễn Duy Phương 161 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn không tồn chu trình Input: 22 43 13 23 54 35 45 66 Output: YES 26 Chu trình đồ thị có hướng Cho đồ thị có hướng G= biểu diễn dạng danh sách cạnh Sử dụng thuật toán BFS, kiểm tra xem đồ thị có tồn chu trình hay khơng? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dịng dịng đưa vào đơi V, vẻV tng ng vi mt cnh ca th ã T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa YES “NO” kết test theo dòng tương ứng với đồ thị tồn khơng tồn chu trình Input: 22 43 13 23 54 35 45 66 Output: YES 27 Đồ thị Euler/ nửa Euler Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Hãy kiểm tra xem đồ thị có phải đồ thị Euler, nửa Euler hay khơng? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa 1, -1, kết test theo dòng tương ứng với đồ thị Euler, nửa Euler, hay Euler nửa Euler Input: Output: Nguyễn Duy Phương 162 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG 10 21 32 32 42 53 43 54 54 65 28 Đồ thị Euler/ nửa Euler Cho đồ thị có hướng liên thông yếu G= biểu diễn dạng danh sách cạnh Hãy kiểm tra xem đồ thị có phải đồ thị Euler, nửa Euler hay khơng? Input: • Dòng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa 1, -1, kết test theo dòng tương ứng với đồ thị Euler, nửa Euler, hay Euler nửa Euler Input: Output: 1 10 22 42 53 13 24 34 55 35 6 29 Chu trình Euler Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Hãy đưa chu trình Euler đồ thị bắt đầu nh uẻV? Input: ã Dũng u tiờn a vo T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào ba số |V|, |E|, V tương ứng với số đỉnh, số cạnh V; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa chu trình Euler đồ thị bắt đầu đỉnh u theo dòng, đưa -1 đồ thị khơng có chu trình Euler Input: Output: 12345246531 10 1 22 42 53 13 24 34 55 35 6 30 Chu trình Euler Cho đồ thị có hướng liên thông yếu G= biểu diễn dạng danh sách cạnh Hãy đưa chu trình Euler đồ thị bắt đầu đỉnh V? Nguyễn Duy Phương 163 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào ba số |V|, |E|, V tương ứng với số đỉnh, số cạnh V; |E| dịng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa chu trình Euler đồ thị bắt đầu đỉnh u theo dịng, đưa -1 đồ thị khơng có chu trình Euler Input: 10 1 32 42 53 43 54 54 65 Output: 12432564531 31 Đường Euler Cho đồ thị vô hướng liên thông G= biểu diễn dạng danh sách cạnh Hãy đưa đường Euler đồ thị? Input: • Dịng đưa vào T số lượng test • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dòng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa đường Euler đồ thị theo dòng, đưa -1 đồ thị khơng có đường Euler Input: 22 53 13 24 34 55 35 6 Output: 2132534654 32 Đường Euler Cho đồ thị có hướng liên thơng yếu G= biểu diễn dạng danh sách cạnh Hãy đưa đường Euler đồ thị? Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh, số cạnh đồ thị; |E| dòng dịng đưa vào đơi V, vỴV tương ứng với cạnh đồ thị Nguyễn Duy Phương 164 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa đường Euler đồ thị theo dịng, đưa -1 đồ thị khơng có đường Euler Input: 22 42 53 13 24 35 35 66 Output: 531243256 33 Biểu diễn đồ thị vơ hướng có trọng số Cho đồ thị vơ hướng có trọng số G= biểu diễn dạng danh sách cạnh trọng số Hãy viết chương trình thực chuyển đổi biểu diễn đồ thị dạng danh sách kề có trọng số Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh đồ thị; |E| dịng dịng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤200; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa danh sách trọng số cạnh kề với đỉnh tương ứng theo khn dạng ví dụ Input: 10 3 3 5 5 5 6 Output: 1: 3->3 2: 3-> 3->5->5 3: 3-> 3-> 5-> 4: 5-> 5-> 2-> 5: 5-> 5-> 2-> 6: 2-> 34 Thuật tốn Kruskal tìm khung nhỏ Cho đồ thị vơ hướng có trọng số G= biểu diễn dạng danh sách cạnh trọng số Hãy viết chương trình tìm khung có độ dài nhỏ thuật tốn Kruskal Input: • Dịng đưa vào T số lượng test Nguyễn Duy Phương 165 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh đồ thị; |E| dòng dòng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤200; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa độ dài khung nhỏ mối test theo dòng; đưa -1 đồ thị không liên thông Input: 10 3 3 5 5 5 6 Output: 15 35 Thuật tốn PRIM tìm khung nhỏ Cho đồ thị vơ hướng có trọng số G= biểu diễn dạng danh sách cạnh trọng số Hãy viết chương trình tìm khung có độ dài nhỏ thuật tốn PRIM Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh đồ thị; |E| dòng dòng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤200; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa độ dài khung nhỏ mối test theo dòng; đưa -1 đồ thị không liên thông Input: 10 3 Output: 15 Nguyễn Duy Phương 166 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG 2 3 4 5 5 6 5 5 2 36 Chu trình âm Cho đồ thị có trọng số G= biểu diễn dạng danh sách cạnh trọng số âm dương Hãy viết chương trình xác định xem đồ thị có chu trình âm hay khơng Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai số |V|, |E| tương ứng với số đỉnh số cạnh đồ thị; |E| dịng dịng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa theo dòng test tương ứng với đồ thị có khơng có chu trình âm Input: 3 -1 -2 3 3 -1 3 -2 Output: 37 Thuật tốn Dijkstra Cho đồ thị có trọng số không âm G= biểu diễn dạng danh sách cạnh trọng số Hãy viết chương trình tìm đường ngắn từ đỉnh V đến tất đỉnh cịn lại đồ thị Input: • Dịng đưa vào T số lượng test Nguyễn Duy Phương 167 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG • Những dòng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai ba số |V|, |E| tương ứng với số đỉnh V đỉnh bắt đầu; |E| dịng dịng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa kết test theo dòng Kết test trọng số đường ngắn từ đỉnh u đến đỉnh lại đồ thị theo thứ tự tăng dần đỉnh Input: 12 1 8 8 11 9 14 10 Output: 12 19 21 11 14 38 Thuật toán Bellman-Ford Cho đồ thị có trọng số âm khơng âm G= biểu diễn dạng danh sách cạnh trọng số Hãy viết chương trình tìm đường ngắn từ đỉnh V đến tất đỉnh cịn lại đồ thị Input: • Dịng đưa vào T số lượng test • Những dịng đưa vào test Mỗi test gồm |E|+1 dòng: dòng đưa vào hai ba số |V|, |E| tương ứng với số đỉnh V đỉnh bắt đầu; |E| dòng dòng đưa vào ba V, vỴV, w tương ứng với cạnh với trọng số canh đồ thị • T, |V|, |E| thỏa mãn ràng buộc: 1≤T≤100; 1≤|V|≤103; 1≤|E|≤|V|(|V|-1)/2; Output: • Đưa kết test theo dòng Kết test trọng số đường ngắn từ đỉnh u đến đỉnh lại đồ thị theo thứ tự tăng dần đỉnh Input: Output: Nguyễn Duy Phương 168 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG 1 2 4 -1 -2 3 -1 2 -3 Nguyễn Duy Phương 169 CHƯƠNG ĐỒ THỊ VÀ ỨNG DỤNG TÀI LIỆU THAM KHẢO Nguyễn Đức Nghĩa., “Cấu trúc liệu giải thuật,” Nhà Xuất Bản KHKT Hà Nội,2013 Đỗ Xuân Lôi.“Cấu trúc liệu giải thuật,” Nhà Xuất Bản KHKT Hà Nội ,2009 Donald E Knuth., “The Art of Computer Programming”, Addison-Wesley, Vol 1, 2, 3, 4, 5, Niklaus Wirth, Data Structures and Algorithms,Prentice Hall, 2003 Nguyễn Duy Phương 170 ... vấn đề bản: biểu diễn thuật toán, ước lượng độ phức tạp thuật toán, cài đặt thuật toán, thử nghiệm thuật tốn Tài liệu sử dụng ngơn ngữ hình thức để biểu diễn thuật toán, sử dụng độ phức tạp cấu... số toán xử lý thuật toán chia trị 56 5.3 Một số toán xử lý thuật toán chia trị nâng cao 60 5.4 Một số toán xử lý thuật toán chia trị tiên tiến 63 CHƯƠNG MƠ HÌNH THUẬT... độ phức tạp thuật toán, sử dụng ngữ lập trình C++ để cài đặt thuật tốn, sử dụng phương pháp thử nghiệm dựa vào liệu để kiểm tra tính đắn thuật tốn 1.1 Thuật toán số vấn đề liên quan Thuật tốn thủ