Lý thuyết đồ thị Giải thuật toán giải thuật Prim Giải thuật toán giải thuật Kruskal Thuật toán Prim Thuật toán Kruskal Tìm theo chiều sâu Tìm theo chiều rộng Cây khung nhỏ nhất Cây khung lớn nhất trọng số
Trang 1TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN – HỆ VB2 ĐÀO TẠO TỪ XA
GVHD Lý Thuyết: Đặng Trần Minh Hậu
GDHD Thực hành: Nguyễn Ngọc Thảo
LỚP: Lý Thuyết Đồ Thị - CSC00008 NHÓM 32
BÁO CÁO BÀI TẬP TUẦN 3
Trang 2MỤC LỤC
A Bài tập lý thuyết 3
Câu 1 3
Câu 2 4
B Bài tập cài đặt 5
Trang 3A Nội dung bài tập lý thuyết
Cho đồ thị như hình bên dưới
Câu 1: Áp dụng giải thuật Prim lên đồ thị đã cho ở trên để tìm cây khung nhỏ nhất bắt đầu tại
đỉnh A.
a Quá trình thực hiện
Lặp Các cạnh e = (v,w) ứng viên tại lần lặp thứ i Y ( giữ nguyên thứ tự) V/Y T ( giữ nguyên thứ tự)
Lặp
lần 1
Lặp
lần 2
Lặp
lần 3
Đầu lặp {(D,H),(D,J),(B,C),(B,J)} {A,D,B} {C,E,F,G,H,I,J} {(A,D),(D,B)}
Lặp
lần 4
Đầu lặp {(D,H),(D,J),(B,J),(C,E),(C,F)} {A,D,B,C} {E,F,G,H,I,J} {(A,D),(D,B),(B,C)}
Lặp
lần 5
Đầu lặp {(D,H),(D,J),(B,J),(C,E),(F,G),(F,I)} {A,D,B,C,F} {E,G,H,I,J} {(A,D),(D,B),(B,C),(C,F)}
Lặp
lần 6
Đầu lặp {(D,H),(D,J),(B,J),(F,G),(F,I),(E,G)} {A,D,B,C,F,E} {G,H,I,J} {(A,D),(D,B),(B,C),(C,F),(C,E)}
Lặp
lần 7
Đầu lặp {(D,H),(D,J),(B,J),(F,I),(G,I),(G,J)} {A,D,B,C,F,E,G} {H,I,J} {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G)}
Lặp
lần 8
Đầu lặp {(D,H),(D,J),(B,J),(G,J),(I,J)} {A,D,B,C,F,E,G,I} {H,J} {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G),(G,I)}
Cuối lặp {A,D,B,C,F,E,G,I,J} {H} {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G),(G,I),(I,J)}
Lặp
lần 9
Đầu lặp {(D,H),(J,H)} {A,D,B,C,F,E,G,I,J} {H} {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G),(G,I),(I,J)}
Cuối lặp {A,D,B,C,F,E,G,I,J,H} ∅ {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G),(G,I),(I,J),(J,H)}
Bảng 1.1 Bảng quá trình chạy thuật toán Prim
Trang 4b Danh sách cạnh của cây khung tìm được và trọng số tương ứng
- Cây khung tìm được : Cây khung {(A,D),(D,B),(B,C),(C,F),(C,E),(E,G),(G,I),(I,J),(J,H)}
- Trọng số cây khung
Bảng 1.2 Bảng cạnh của cây khung và trọng số tương ứng
- Tổng trọng số = 1+4+4+1+2+2+3+3+2 = 22
Câu 2: Áp dụng giải thuật Kruskal lên đồ thị đã cho ở trên để tìm cây khung nhỏ nhất
a Quá trình thực hiện
Danh sách cạnh E đã sắp xếp kèm theo trọng số tương ứng
Trang 5E đã sắp xếp
Bảng 2.1 Danh sách cạnh E đã sắp xếp kèm trọng số tương ứng
được lấy
T ∪ {e} có tạo thành chu
Lặp lần 7 GI Không {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I)}
Lặp lần 8 IJ Không {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I), (I,J)}
Lặp lần 9 AB Không {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I), (I,J),(A,B)}
Lặp lần 10 DB Có {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I), (I,J),(A,B)}
Lặp lần 11 GJ Có {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I), (I,J),(A,B)}
Lặp lần 12 BC Không {(A,D),(C,F),(C,E) ,(E,G) ,(H,J), (G,I), (I,J),(A,B),(B,C)}
Bảng 2.2 Bảng quá trình chạy thuật toán Kruskal
b Danh sách cạnh của cây khung tìm được và trọng số tương ứng
- Cây khung tìm được: Cây khung {(A,D),(C,F),(C,E),(E,G),(H,J),(G,I),(I,J),(A,B),(B,C)}
- Trọng số cây khung
Bảng 2.3 Bảng cạnh của cây khung và trọng số tương ứng
- Tổng trọng số = 1+1+2+2+2+3+3+4+4 = 22
Trang 6B Nội dung bài tập cài đặt
Cho tập tin input.txt chứa ma trận kề của một đồ thị vô hướng liên thông Tập tin có định
dạng như sau:
▪ Dòng đầu tiên chứa số nguyên n (n > 2) thể hiện số đỉnh của đồ thị.
▪ n dòng tiếp theo chứa n số nguyên trên mỗi dòng, các số nguyên cách nhau bằng
khoảng trắng Gọi [i, j] là giá trị tại dòng i cột j (i, j = 0,…,n-1) [i, j] = 0: không có cạnh nối
từ đỉnh i đến đỉnh j, [i, j] = x > 0: có cạnh nối từ i đến j với trọng số x.
a Cài đặt giải thuật Prim để tìm cây khung nhỏ nhất trên đồ thị đã cho Đỉnh bắt đầu do
người dùng nhập từ bàn phím Xuất ra màn hình thông tin của cây khung nhỏ nhất tìm được
- Danh sách cạnh thuộc cây khung nhỏ nhất theo thứ tự được phát hiện bởi giải thuật Quy ước: In mỗi cạnh trên một dòng riêng biệt theo mẫu <x>-<y>: <z>, với x và y là hai đỉnh của cạnh và z là trọng số của cạnh.
- Trọng số của cây khung nhỏ nhất
b Cài đặt giải thuật Kruskal để tìm cây khung nhỏ nhất trên đồ thị đã cho Xuất ra màn
hình thông tin của cây khung nhỏ nhất theo quy cách tương tự như ở câu a.
Chương trình được sử dụng cấu trúc dữ liệu cơ bản như stack, (priority) queue, vector, list, v.v.
Không được sử dụng thư viện cài đặt cây khung nhỏ nhất có sẵn
Trang 71 Những lưu ý quan trọng
- Chương trinh gồm 1 class chính (Program.cs) nơi gọi file.txt và xuất kết quả và các class chức năng
- Chương trình hoạt động với các trọng số t trong file txt với t < 10
- Lưu ý copy đường dẫn vào hàm main để chương trình truy xuất vào đúng file (bôi màu vàng trong hình)*
*ví dụ đường dẫn: @"D:\VB 2 KHTN\Lý thuyết đồ thị\Bai Tap\Bài tập tuần 03 - Có tính
điểm\N32-21880053,21880147-BTTuan03\SOURCE\testcase2.txt"
Trang 8Hình 1.1 Vị trí đường dẫn
- Các class và hàm chức năng gồm có
Class/Struct Bao gồm/Chức năng
Program - Hàm Main: Hàm chính chạy chương trình
EdgeStruct - Khởi tạo kiểu dữ liệu Edge
Graph Handler - Struct AdjacencyMatrix: Kiểu dữ liệu tự định nghĩa cho
AdjacencyMatrix
- Hàm InputAndStore : Đọc và trữ dữ liệu từ file txt
- Hàm OutputGraph: In ra ma trận kề QuickSort - Hàm Parting: Tìm điểm phân chia của quicksort
- Hàm Sort: hàm chính của quicksort
Trang 9MinimumSpanningTree - Hàm Prim : Hàm chạy thuật toán Prim và xuất kết quả ra màn hình
- Hàm SortWeightInEdgeList: Hàm gọi Sort và tạo ra List các Edge đã Sort
- Hàm checkCycle: Hàm check nếu thêm edge cần check vào thì có tạo Cycle không
- Hàm refreshIndex: Refresh tất cả index có liên quan trong cùng 1 cycle
- Hàm Kruskal: Hàm chính thuật toán Kruskal và xuất kết quả ra màn hình
2 Kết quả bài làm
Trang 10Hình 2.1 Kết quả testcase 1
Trang 11Hình 2.1 Kết quả testcase 2