Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 48 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
48
Dung lượng
1,51 MB
Nội dung
LỜI CẢM ƠN Để hoàn thành tốt đề tài Nghiên cứu khoa học nhờ hướng dẫn giúp đỡ giảng viên Ts Hoàng Văn Dũng Em xin chân thành cảm ơn giúp đỡ thầy Em cảm ơn thầy cô khoa Kỹ thuật – Công nghệ thông tin trường Đại học Quảng Bình tận tình giảng dạy, truyền đạt kiến thức quý báu tạo điều kiện cho em hoàn thành báo cáo Mặc dù cố gắng nhiều để hoàn thành đề tài với tất nổ lực thân, không tránh khỏi thiếu sót Em mong nhận ủng hộ giúp đỡ thầy cô bạn Quảng Bình, ngày 20 tháng 05 năm 2017 Sinh viên thực Phạm Tuấn Vũ MỞ ĐẦU 1 Lý chọn đề tài Mục tiêu nghiên cứu Nội dung nghiên cứu Đối tượng, phạm vi nghiên cứu Phương pháp nghiên cứu CHƯƠNG 1: ĐẠI CƯƠNG VỀ LÝ THUYẾT ĐỒTHỊ 1.1 Một số khái niệm liên quan đến đồthị 1.1.1 Định nghĩa đồthị 1.1.2 Các loại đồthị 1.2 Đồthị con, đồthị phận tính liên thơng đồthị 1.2.1 Đồthị con, đồthị phận 1.2.2 Tính liên thông đồthị 1.3 Đồthị Euler, đồthị nửa Euler đồthị Hamilton 1.3.1 Đồthị Euler đồthị nửa Euler 1.3.2 Đồthị Hamilton 1.4 Biểu diễn đồthị máy tính 1.4.1 Biểu diễn ma trận kề, ma trận trọng số: 1.4.2 Danh sách cạnh 1.4.3 Danh sách kề CHƯƠNG 2: GIỚI THIỆU MỘT SỐ THUẬTTOÁNTRÊNĐỒTHỊ 12 2.1 Thuật tốn tìm kiếm đồthị 12 2.1.1 Tìm kiếm theo chiều sâu đồthị 12 2.1.2 Tìm kiếm theo chiều rộng đồthị 12 2.1.3 Tìm đường kiểm tra tính liên thông 14 2.2 Đồthị có trọng số tốn tìm đường ngắn 14 2.2.1 Đường ngắn đồthị khơng có trọng số 14 2.2.2 Tìm đường ngắn 15 2.2.3 Thuậttoán Ford – Bellman 15 2.2.4 Thuậttoán Dijkstra 15 2.2.5 Thuậttoán Floyd – đường ngắn tất cặp đỉnh 16 CHƯƠNG 3: LUỒNG CỰC ĐẠI VÀHƯỚNGỨNGDỤNG 18 3.1 Giới thiệu luồng cực đại 18 3.1.1 Bài toán luồng mạng 18 3.1.2 Bài toán luồng cực đại mạng 18 3.1.3 Mạng, luồng mạng, toán luồng cực đại 18 3.2 Ứngdụngtoán luồng cực đại mạng 19 3.3 Một số toántốiưu tổ hợp ứngdụng từ toán luồng 25 3.3.1 Bài toán thủy lợi 26 3.3.2 Bài toán hệ thống đại diện chung 27 3.3.3 Về toántốiưu rời rạc 27 3.4 Kết luận 28 CHƯƠNG 4: MƠ PHỎNG THUẬT TỐN 29 4.1 Phát biểu toán 29 4.2 Yêu cầu toán 30 4.3 Cấu trúc chương trình 31 4.4 Hoạt động chương trình 33 4.4.1 Chức file class chương trình 34 4.4.2 Trình tự hoạt động 35 KẾT LUẬN VÀHƯỚNG PHÁT TRIỂN 36 TÀI LIỆU THAM KHẢO 37 PHỤ LỤC 38 DANH MỤC TỪ VIẾT TẮT: Tiếng việt: Từ viết tắt NNLT Diễn giải Ngôn ngữ lập trình Tiếng anh: Từ viết tắt Linked Adjancency List Strongly connected Depth first search (DFS) BFS Diễn giải Danh sách kề liên kết Liên thơng mạnh Tìm kiếm sâu Tìm kiếm theo chiều rộng DANH MỤC HÌNH ẢNH Hình 1.1 Đồthị liên thông, đồthị không liên thông Hình 1.2 Liên thơng mạnh liên thông yếu Hình 1.3 Bảy cầu sơng Pregel Hình 1.4 Đồthị biểu diễn thành phố Konigsberg Hình 1.5 Đồthị Euler đồthị nửa Euler Hình 1.6 Đường Hamilton Hình 1.7.Đồ thị vơ hướng G Đồthị có hướng G1 Hình 4.1 Cấu trúc chương trình 31 Hình 4.2 Giao diện ứngdụng 32 Hình 4.3 Giao diên chạy ứngdụng 32 Hình 4 Vẽ điểm 33 Hình 4.5 Vẽ đường 34 Hình 4.6 Các chức chương trình 35 MỞ ĐẦU Lý chọn đề tài Trong năm trở lại đây, với đời máy tính điện tử phát triển nhanh chóng Tin học, lý thuyết đồthị quan tâm đến nhiều Đặc biệt thuậttoánđồthị có nhiều ứngdụng nhiều lĩnh vực khác như: Mạng máy tính, Lý thuyết mã, Tốiưu hố, Kinh tế học v.v Nó trả lời cho câu hỏi: Hai máy tính mạng liên hệ với hay không? Hay vấn đề phân biệt hai hợp chất hố học có công thức phân tử lại khác công thức cấu tạo giải nhờ mơ hình đồthị Lý thuyết đồthị khơng có nhiều ứngdụng thực tế mà cơng cụ đắc lực cho ngành cơng nghệ thơng tin Nó giúp cho mô tả cách dễ dàng tốn phức tạp cụ thể, để từ ta mã hố tốn vào máy tính Hiện có nhiều tài liệu, sách, giáo trình viết lý thuyết đồthị với nội dung, đầy đủ giúp cho người muốn nghiên cứu lý thuyết đồthị tham khảo Tuy nhiên hầu hết tài liệu nghiên cứu lý thuyết xây dựngthuậttoán chung cho tốn mà chưa có nhiều tài liệu viết ứngdụngthuậttoán để giải toánứngdụng cụ thể Để thực hóa việc học tập, giảng dạy Tin học trường Trung học phổ thông trường Đại học, Cao đẵng luận văn “Tìm hiểuthuật tốn tốiưuđồthịhướngứngdụng ” thực cần thiết Mục tiêu nghiên cứu Mục tiêu đề tài nghiên cứu lý thuyết đồthị số thuậttoánứngdụngđồthị vào học tập sống Nội dung nghiên cứu - Chương I: Tổng quan lý thuyết đồthị - Chương II: Một số toántốiưuđồthị - Chương III: Luồng cực đại hướngứngdụng - Chương IV: Mơ thuật tốn Đối tượng, phạm vi nghiên cứu - Đối tượng nghiên cứu: Lý thuyết đồthịứngdụngđồthị - Phạm vi nghiên cứu: Lý thuyết đồ thị, ứng dụng, xây dựng, lập trình mơ hệ thống hóa ứngdụngthuậttoán liên quan đến đồthị nhằm phục vụ cho việc học tập việc giảng dạy nhà trường Phương pháp nghiên cứu - Phương pháp nghiên cứu lý thuyết: + Nghiên cứu lý thuyết đồ thị, thuậttoánứngdụngđồthị + Hệ thống hóa số ứngdụngđồthị - Phương pháp nghiên cứu thực nghiệm: Sử dụng phương pháp nghiên cứu lý thuyết kết hợp với nghiên cứu thực nghiệm: + Nghiên cứu, tìmhiểuứngdụng liên quan đến đề tài thực tế + Viết chương trình cho tốn ứngdụng cụ thể CHƯƠNG 1: ĐẠI CƯƠNG VỀ LÝ THUYẾT ĐỒTHỊ 1.1 Một số khái niệm liên quan đến đồthị 1.1.1 Định nghĩa đồthị Định nghĩa: Đồthị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh đồthị Các loại đồthị khác phân biệt kiểu số lượng cạnh nối hai đỉnh đồthị [2] - Nếu cạnh u = (x,y) mà x y hai đỉnh phân biệt ta nói x, y hai đỉnh kề - Nếu u = (x,x) u cạnh có hai đỉnh trùng ta gọi khuyên - Nếu u = (x,y) mà x,y cặp đỉnh có phân biệt thứ tự hay có hướng từ x đến y u cung, x gốc y x đỉnh ra, y đỉnh vào - Khi cặp đỉnh (x, y) có nhiều cạnh ta nói cạnh cặp đỉnh cạnh song song cạnh bội 1.1.2 Các loại đồthị a Đồthị vô hướngĐồthị G= gọi đồthị vô hướng tất cạnh u ε U mà cặp đỉnh thuộc u = (x,y) (trong x,y ε X) không phân biệt thứ tự Đồthị vô hướngđồthị khơng có cung [2] b Đồthị có hướngĐồthị G = gọi đồthị có hướng tất cạnh u ϵ U mà cặp đỉnh thuộc u = (x, y) (trong x,y ε X) có phân biệt thứ tự Đồthị có hướngđồthị mà u=(x, y) ε X cung [2] 1.2 Đồthị con, đồthị phận tính liên thơng đồthị 1.2.1 Đồthị con, đồthị phận Cho đồthị G = - Nếu đồthị ta bỏ số đỉnh cạnh(cung) xuất phát từ đỉnh phần lại đồthị gọi đồthịđồthị G cho - Nếu đồthị G ta bỏ số cạnh giữ nguyên đỉnh phần lại đồthị gọi đồthị phận đồthị G 1.2.2 Tính liên thơng đồthị 1.2.2.1 Tính liên thơng đồthị vô hướng Định nghĩa: Một đồthị gọi liên thơng có đường cặp đỉnh phân biệt đồthị Ngược lại, đồthị gọi không liên thông [2] G: liên thông; H: không liên thông G H Hình 1.1 Đồthị liên thơng, đồthị khơng liên thông Cho đồthị G=(V,E) v V V' tập hợp đỉnh V liên thông với v, E' tập hợp cạnh nối đỉnh V' Khi đồthị G' = (V',E') gọi thành phần liên thông (connected component) G chứa v Đương nhiên v u liên thông G thành phần liên thơng G chứa v thành phần liên thông chứa u Định lý: Đồthị G=(V, E) liên thông G có thành phần liên thơng [2] 1.2.2.2 Tính liên thơng đồthị có hướng G gọi liên thông mạnh tồn đường (theo cung định hướng) hai đỉnh đồ thị, g gọi liên thông yếu đồthị vơ hướng liên thơng Hình 1.2 Liên thơng mạnh liên thơng yếu Định lý: Nếu đồthị G=(V, E) có hai đỉnh bậc lẻ hai đỉnh phải liên thông với [2] Định lý: (Định lý điều kiện cần đủ đồthị lưỡng phân) Đồthị G = (V, E) đồthị lưỡng phân chu trình có độ dài chẵn [2] 1.3 Đồthị Euler, đồthị nửa Euler đồthị Hamilton 1.3.1 Đồthị Euler đồthị nửa Euler Xét toán cầu Konigsberg [3] Thành phố Konigsberg thuộc nước Cộng hồ Litva có sơng Pregel chảy qua, sơng có cù lao Kneiphof tạo nên bốn vùng đất Người ta xây dựng cầu để nối vùng đất lại với Năm 1736 L Euler, nhà toán học người Thuỵ Sĩ đưa tốn sau đây: Hỏi qua cầu, cầu qua lần quay trở chỗ xuất phát hay khơng? Bài tốn làm say mê cư dân thành phố Họ háo hức thử khơng thành cơng Sau đó, L Euler chứng minh tốn khơng giải Hình 1.3 Bảy cầu sơng Pregel Nếu biểu diễn vùng đất: A, B, C, D đỉnh đa đồ thịvơ hướng có cạnh nối chúng có cầu nối tương ứng, tốn đưa việc tìm chu trình qua cạnh đồthị lần Hình 1.4 Đồthị biểu diễn thành phố Konigsberg Trong lý thuyết đồ thị, cho đồthị G=(V,E), V tập hợp đỉnh, E tập hợp cạnh Từ toán trên, người ta đưa khái niệm, định nghĩa chu trình đường Euler - Đường Euler đường đi, qua tất cạnh đồ thị, cạnh lần điểm đầu điểm cuối khơng trùng - Chu trình Euler chu trình qua tất cạnh đồ thị, cạnh lần đỉnh đầu đỉnh cuối trùng (đồ thị có đỉnh lập) CHƯƠNG 4: MƠ PHỎNG THUẬT TỐN 4.1 Phát biểu tốn Hiện có nhiều tài liệu, sách, giáo trình viết lý thuyết đồthị với nội dung, đầy đủ giúp cho người muốn nghiên cứu lý thuyết đồthị tham khảo Tuy nhiên hầu hết tài liệu nghiên cứu lý thuyết xây dựngthuật tốn chung cho tốn mà chưa có nhiều tài liệu viết ứngdụngthuậttoán để giải toánứngdụng cụ thể Để thực hóa việc học tập, giảng dạy cách tạo ứngdụng nhằm nâng cao hiệu dạy học thúc đẩy trình tự học, nghiên cứu học sinh, sinh viên theo hướngtốiưu hố, kích thích lực sáng tạo, với lý luận văn xây dựngứngdụngtìm luồng cực đại sử dụngthuậttoán ford fulkerson cần thiết * Phát biểu toán Giả xử đồthị G, ngồi khả thơng qua cung c(u,v), đỉnh v V có khả thơng qua đỉnh d(v), đòi hỏi tổng luồng vào đỉnh v khơng vượt d(v), tức f (w, v) d (v) wV Cần phải tìm luồng cực đại s t mạng Xây dựng mạng G’ cho: đỉnh v G tương ứng với hai đỉnh v+, vtrong G’, cung (u,v) G ứng với cung (u,v+) G’, cung (v,w) G ứng với cung (v-,w+) G’ Ngoài ra, cung (v+,v-) G’ có khả thơng qua d(v), tức khả thông qua đỉnh v G * Phương pháp giải Từ mạng G = (V,E) với khả thông qua cung đỉnh Ta tìm luồng cực đại mạng qua hai bước sau: Bước 1: Xác định mạng G’ Bước 2: Tìm luồng cực đại mạng G’ Bắt đầu từ luồng zero với khả thông qua cung Hai bước ta biểu diễn dạng sơ đồthuậttoán sau: 29 Begin Mạng G Mạng G’ Luồng cực đại G’ End * Biểu diễn đồthị - Biểu diễn mạng G với khả thông qua cung - đỉnh Giả sử mạng G = (V,E), |V| = n Ta biểu diễn ma trận trọng số A cấp n x n sau: di i = j A = ( aij ) = c[i,j] [i,j] E Trong đó: di khả thơng qua đỉnh i; C[i,j] khả thông qua cung [i,j] - Biểu diễn mạng G’ tương ứng với mạng G Mạng tương ứng với G = (V,E), |V | = n mạng G’ = (V’,E’), |V’| = |V |, |E’| = |E | - Được biểu diễn thông qua ma trận A’ cấp (2n x 2n) sau: A’ = ( a’ij ) = 4.2 Yêu cầu ứngdụng i = j c[i,j] [i,j] E’ - Sử dụng ngơn ngữ lập trình Java để viết thuật tốn Ford Fulkerson [4] - Cơng cụ thiết kế IdeaIU để xây dựng giao diện - Các chức như: + Phương thức Method Input: 30 Chọn phương thức nhập vào, bao gồm: Demo: Sử dụngđồthị có sẵn ứngdụng Drow: Tự vẽ đồthị + Point: Chọn điểm bắt đầu điểm kết thúc đồthị + Output: Gồm giao diện hiển thị kết Hiển thị dạng hình ảnh trực quan Hiển thị dạng ma trận Hiển thị số luồng cực đại thứ tự đỉnh + Các công cụ lưu file, mở file 4.3 Cấu trúc chương trình Hình 4.1 Cấu trúc chương trình Project gồm packages demo, file, icon packages demo chứa file liệu phục vụ đồthị xây dựng sẵn, packages file chứa file about help chứa nội dung giới thiệu chương trình trợ giúp người dùng, packages icon chứa ảnh làm icon, packages packages chứa file cài đặt chương trình 31 Hình 4.2 Giao diện ứngdụng Giao diện chạy chương trình Hình 4.3 Giao diên chạy ứngdụng 32 4.4 Hoạt động chương trình Giao diện chương trình gồm ba phần chính: Phần điểu khiển: phần bên trái gồm mục cho phép chọn loại đồthị (Map Type) có hướng vơ hướng, chọn điểm đầu, điểm cuối đường (Point), chọn chế độ tự vẽ hay dùng demo có sẵn (Input Method), chế độ chạy toàn chạy theo bước cuối ma trận trọng số đồthị Phầm vẽ đồthị nằm bên phải Phần chia làm phần, giao diện để vẽ đồthị dọc cho phép chọn đối tượng vẽ (vẽ điểm, vẽ đường thẳng, di chuyển điểm, tạo cập nhật đồ thông tin đồ thị) Sau vẽ xong đồ thị, người dùng nhấn vào nút cập nhật đồthị phần điểu khiển cho phép chọn điểm đầu, điểm cuối cập nhật ma trận trọng số chạy Hình 4 Vẽ điểm 33 Hình 4.5 Vẽ đường Phần Log nằm để ghi lại trình thực Phần có phần nhỏ, phần hiển thị lại đường đi, phần bảng hiển thị thông tin giống thực tay việc tìm đường Ngồi bên menu chứa menu lựa chọn 4.4.1 Chức file class chương trình Packages chứa file *.java MyMain, MyFrame, MyDraw, MyLine, MyPoint, FordFulkerson, MyData, MyPopupMenu HelpAndAbout Class MyMain chứa hàm main khởi chạy chương trình việc tạo gọi cửa sổ chương trình class MyFrame Class MyFrame cửa sổ chương trình cho phép người dùng tương tác Class MyPoint chứa thuộc tính điểm Class MyLine chứa thuộc tính đường Class MyDraw JPanel nằm Frame (phần màu xẫm bên phải) để hiển thị vẽ đối tượng (các điểm đường đồ thị) Class FordFulkerson chứa phương thức thực thuật tốn FordFulkerson Class MyData gồm thuộc tính liệu phục vụ cho việc sử dụng demo 34 xây dựng sẵn Class MyPopupMenu chứa số tùy biến để thực việc hiển thị menu click chuột phải cho phép xóa thay đổi điểm, đường Class HelpAndAbout tạo cửa sổ hiển thị nội dung trợ giúp giới thiệu Hình 4.6 Các chức chương trình 4.4.2 Trình tự hoạt động Khi chạy chương trình, Class MyMain gọi đến MyFrame để tạo giao diện chương trình Khi giao diện khởi tạo gọi đến MyDraw phần để vẽ đồthị Trong trình tương tác xử lý, class khác gọi đến MyPoint gọi vẽ điểm MyLine gọi thực vẽ đường đồthị FordFulkerson gọi thực việc tìm kiếm đường sau vẽ xong đồthị MyData gọi đến sử dụng chương trình demo có sẵn MyPopupMenu thực click chuột phải để thực xóa, sửa đồthị Khi chọn menu Help About HelpAndAbout gọi để hiển thị phần trọ giúp giới thiệu chương trình 35 KẾT LUẬN VÀHƯỚNG PHÁT TRIỂN Kết Luận - Lý thuyết đồthị có nhiều ứngdụng thực tế mà công cụ đắc lực cho ngành công nghệ thông tin Nó giúp cho mơ tả cách dễ dàng toán phức tạp cụ thể, để từ ta mã hố tốn vào máy tính mà tốn luồng cực đại mạng hai nhà toán học Mỹ Ford Fullkerson ví dụ điển hình, thơng qua việc cài đặt thuật tốn giúp có giải pháp, lựa chọn đắn để đem lại hiệu kinh tế - Luận văn nghiên cứu trình bày kiến thức lý thuyết đồ thị, luận văn phân tích kỹ thuật tốn tốn ứngdụngthuậttoánđồthị - Để thực hóa việc học tập, giảng dạy luận văn tạo ứngdụngtìm luồng cực đại sử dụngthuậttoán ford fulkerson với giao diện dễ sử dụng, tốn nhớ, tốc độ xử lý thực ứngdụng nhanh nhằm nâng cao hiệu dạy học thúc đẩy trình tự học, nghiên cứu học sinh, sinh viên theo hướngtốiưu hố, kích thích lực sáng tạo Hướng Phát Triển - Do thời gian kinh nghiệm nghiên cứu thiếu, kiến thức hạn chế, hướng phát triển luận văn tìmhiểu sâu thuậttoántốiưuđồthị hoàn thiện sản phẩm ứngdụng 36 TÀI LIỆU THAM KHẢO [1] Lê Duy Quang, (2015), Bài toán luồng cực đại [2] Lê Minh Hoàng, (2002), Chuyên đề lý thuyết đồthị [3] Lương Văn Chất, (2012), Nghiên cứu thuậttoán lý thuyết đồthịứngdụng dạy tin học chuyên Trung học phổ thông [4] Đặng Qúy Linh, (2012), Bài tốn tìm luồng cực đại mạng theo thuậttoán ford-fulkerson Website: [5] http://vnoi.info/wiki/translate/wcipeg/Flows, Lý Thuyết đồthị [6] https://vi.wikipedia.org/wiki/ , Lý Thuyết đồ thị, toán luồng cực đại 37 PHỤ LỤC Code Java: Ford Fullkerson package nguyenvanquan7826; import java.util.ArrayList; public class FordFulkerson { private boolean debug = true; private ArrayList arrMyPoint = new ArrayList(); private ArrayList arrMyLine = new ArrayList(); public int input(int G[][]) { int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } return n; } void outMatrix(int G[][], int n) { for (int u = 1; u < n; u++) { for (int v = 1; v < n; v++) { System.out.print(G[u][v]); } System.out.println(); } } boolean bfs(int rG[][], int pre[], int s, int t, int n) { boolean visited[] = new boolean[n]; for (int i = 0; i < n; ++i) { visited[i] = false; } ArrayList q = new ArrayList(); q.add(s); visited[s] = true; pre[s] = -1; while (!q.isEmpty()) { int u = q.get(0); q.remove(0); for (int v = 1; v < n; v++) { if (!visited[v] && rG[u][v] > 0) { q.add(v); 38 pre[v] = u; visited[v] = true; } } } return visited[t]; } int fordFulkerson(int G[][], int rG[][], int s, int t, int n) { int u, v; int sum = 0; int pre[] = new int[n]; int maxFlow = 0; for (u = 0; u < n; u++) { for (v = 0; v < n; v++) { rG[u][v] = G[u][v]; sum += G[u][v]; } } if (debug) System.out.println("sum = " + sum); String textLog = ""; while (bfs(rG, pre, s, t, n) == true) { int numFlow = sum; v = t; u = pre[v]; int path[] = new int[n]; int indexPath = 0; while (v != s) { textLog = v + "< "; if (debug) System.out.println(textLog); if (onRunListener != null) { onRunListener.onLog(textLog); } path[indexPath++] = v; numFlow = Math.min(numFlow, rG[u][v]); v = u; u = pre[v]; } textLog = v + "\n" + "numFlow = " + numFlow + "\n"; if (debug) System.out.println(v + "\n" + "numFlow = " + numFlow + "\n"); 39 if (onRunListener != null) { onRunListener.onLog(textLog); } path[indexPath++] = v; if (onRunListener != null) { onRunListener.onPathStep(path, indexPath); } v = t; u = pre[v]; while (v != s) { rG[u][v] = rG[u][v] - numFlow; rG[v][u] = rG[v][u] + numFlow; v = u; u = pre[v]; } maxFlow = maxFlow + numFlow; } return maxFlow; } int fordFulkersonStep(int G[][], int rG[][], int s, int t, int n, int step) { int u, v; int sum = 0; int pre[] = new int[n]; int maxFlow = 0; for (u = 0; u < n; u++) { for (v = 0; v < n; v++) { rG[u][v] = G[u][v]; sum += G[u][v]; } } if (debug) System.out.println("sum = " + sum); String textLog = ""; int mStep = 0; while (bfs(rG, pre, s, t, n) == true && mStep < step) { int numFlow = sum; v = t; u = pre[v]; int path[] = new int[n]; int indexPath = 0; 40 while (v != s) { textLog += v + "< "; if (debug) System.out.println(textLog); path[indexPath++] = v; numFlow = Math.min(numFlow, rG[u][v]); v = u; u = pre[v]; } textLog += v + "\n" + "numFlow = " + numFlow + "\n"; if (debug) System.out.println(v + "\n" + "numFlow = " + numFlow + "\n"); path[indexPath++] = v; if (onRunListener != null) { onRunListener.onPathStep(path, indexPath); } v = t; u = pre[v]; while (v != s) { rG[u][v] = rG[u][v] - numFlow; rG[v][u] = rG[v][u] + numFlow; v = u; u = pre[v]; } maxFlow = maxFlow + numFlow; mStep++; } if (onRunListener != null) { onRunListener.onLog(textLog); } return maxFlow; } void track(int G[][], int rG[][], int n) { System.out.println("Edeg of MaxFlow with value:\n"); for (int u = 1; u < n; u++) { for (int v = 1; v < n; v++) { int f = G[u][v] - rG[u][v]; if (f > 0) { System.out.println(u + "->" + v + " [" + f + "]"); if (onRunListener != null) { onRunListener.onLoadEdeg(u, v, f); } } } 41 } } public FordFulkerson setArrMyPoint(ArrayList arrMyPoint) { this.arrMyPoint = arrMyPoint; return this; } public FordFulkerson setArrMyLine(ArrayList arrMyLine) { this.arrMyLine = arrMyLine; return this; } void run(int s, int t) { int G[][] = null, rG[][] = null; int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; rG = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } int maxFlow = fordFulkerson(G, rG, s, t, n); track(G, rG, n); String textLog = "==============================\n" + "maxFlow = " + maxFlow; if (onRunListener != null) { onRunListener.onLog(textLog); } System.out.println(textLog); } void runStep(int s, int t, int step) { int G[][] = null, rG[][] = null; int n = arrMyPoint.size(); // System.out.println(size); G = new int[n][n]; rG = new int[n][n]; for (int i = 1; i < arrMyLine.size(); i++) { G[arrMyLine.get(i).getIndexPointA()][arrMyLine.get(i).getIndexPointB()] = arrMyLine.get(i).getCost(); } 42 int maxFlow = fordFulkersonStep(G, rG, s, t, n, step); System.out.println("maxFlow = " + maxFlow); track(G, rG, n); } interface OnRunListener { void onLoadEdeg(int u, int v, int f); void onLog(String textLog); void onPathStep(int path[], int sizePath); } private OnRunListener onRunListener; public void setOnRunListener(OnRunListener onRunListener) { this.onRunListener = onRunListener; } } 43 ... phân biệt thứ tự Đồ thị có hướng đồ thị mà u=(x, y) ε X cung [2] 1.2 Đồ thị con, đồ thị phận tính liên thơng đồ thị 1.2.1 Đồ thị con, đồ thị phận Cho đồ thị G = - Nếu đồ thị ta bỏ số đỉnh... phần lại đồ thị gọi đồ thị đồ thị G cho - Nếu đồ thị G ta bỏ số cạnh giữ ngun đỉnh phần lại đồ thị gọi đồ thị phận đồ thị G 1.2.2 Tính liên thơng đồ thị 1.2.2.1 Tính liên thông đồ thị vô hướng Định... TOÁN TRÊN ĐỒ THỊ 2.1 Thuật tốn tìm kiếm đồ thị 2.1.1 Tìm kiếm theo chiều sâu đồ thị Tìm kiếm ưu tiên chiều sâu hay tìm kiếm theo chiều sâu (DFS) thuật tốn duyệt tìm kiếm một đồ thị Thuật toán khởi