Bài toán về cây bao trùm là một trong những ứng dụng quan trọng của lý thuyết đồ thị.Bài toán tìm cây khung có trọng lượng nhỏ nhất là điển hình của vấn đề tìm cây khung. Nhiều bài toán thực tế khác nhau đã được đưa về bài toán dạng này, mà nội dung cơ bản là: tìm cây khung có trọng lượng nhỏ nhất của một đồ thị vô hướng liên thông. Hiện nay yêu cầu thực tế của các bài toán tìm cây khung rất đa dạng và có rất nhiều phương pháp khác nhau để giải. Tuy nhiên phương pháp dựa trên lý thuyết đồ thị là phương pháp thực sự có hiệu quả để giải các bài toán dạng này.
Trang 1ĐÁNH GIÁ KẾT QUẢ THỰC HIỆN NIÊN LUẬN 1
(Học kì II, Niên khóa 2009 - 2010)
TÊN ĐỀ TÀI: TÌM CÂY KHUNG CÓ TRỌNG LƯỢNG NHỎ NHẤT TRÊN
ĐỒ THỊ VÔ HƯỚNG BẰNG GIẢI THUẬT PRIM
(tối đa 0.5 điểm)
Bìa: (tối đa 0.25điểm)………
Các tiêu đề:Trường DHCT, Khoa CNTT
Loại đồ án, Tên đề tài
Giáo viên hướng dẫn
Thông tin về sinh viên thực hiên, Năm thực hiện
Bốcục:(tối đa 0.25 điểm)………
Trang nhận xét của giáo viên hướng dẫn và giáo viên chấm
Mục lục: (cấu trúc chương, mục, tiểu mục)
Phụ lục: (nếu có)
Tài liệu tham khảo
II NỘI DUNG: (tối đa 3.5 điểm)… ………
II 1 Tổng quan (tối đa 0.5 điểm)… ………
Mô tả bài toán, mục tiêu cần đạt được (0.25 điểm)
Hướng giải quyết và kế hoạch thực hiện (0.25 điểm)
II 2 Lý thuyết: (tối đa 0.5 điểm)………
Các khái niệm sử dụng trong đề tài
Kết quả vận dụng lý thuyết vào đề tài
Trang 2II 3 Ứng dụng: (tối đa 2.0 điểm)……….
Phân tích yêu cầu bài toán, xây dựng các cấu trúc dữ liệu cần thiết (0.5điểm)
Giải thuật (Lưu đồ-Ngôn ngữ giả) (1.0 điểm)
Giới thiệu chương trình (0.5 điểm)
II 4 Kết luận: (tối đa 0.5 điểm)………
Nhận xét kết quả đạt được
Hạn chế
Hướng phát triển
III CHƯƠNG TRÌNH DEMO: (tối đa 5.0 điểm)
Giao diện thân thiện với người dùng (1.0 điểm)
Trang 3
Cần Thơ, ngày ……tháng 4 năm 2010 Giáo viên hướng dẫn và chấm điểm
Trang 4Thưa thầy:
Trong suốt thời gian nghiên cứu và tìm hiểu để thực hiện đề tài niên luận 1,
em đã nhận được sự chỉ dẫn tận tình của Thầy giúp em vượt qua những khó khăn.
Và hôm nay em đã hoàn thành niên luận 1.
Em xin chân thành cảm ơn thầy Lê Đức Thắng, giúp em giải quyết nhữngkhó khăn vấp phải khi thực hiện niên luận…Cảm ơn các bạn học đã trợ giúp mình,trao đổi về ngôn ngữ, giải thuật, động viên mình những lúc khó khăn Cảm ơn cácbạn rất nhiều
Dù không tránh khỏi những khiếm khuyết do hạn chế về mặt thời gian cũngnhư một số kiến thức trong công việc tìm cây khung có trọng lượng nhỏ nhất trên
đồ thị vô hướng còn yếu, nhưng em cũng đã nổ lực hết sức để giải quyết các yêucầu đặt ra Sau gần hai tháng thực hiện, Niên Luận I của em đã đáp ứng đầy đủđược các yêu cầu của đề tài đặt ra Em rất mong nhận được những ý kiến đóng góphết sức quý báu của quý thầy cô và bè bạn để đề tài ngày càng được hoàn thiệnhơn
Chân thành cảm ơn !
Cần Thơ, ngày 04 tháng 04 năm 2010
Sinh viên thực hiện
Võ Thị Tú
Trang 5MỤC LỤC
LỜI MỞ ĐẦU……… 6
CHƯƠNG I: TỔNG QUAN………7
1.1 Mô tả bài toán, mục tiêu và phạm vi cần đạt được………7
1.1.1 Mô tả bài toán……… ……… 7
1.1.2 Mục tiêu cần đạt được………7
1.2 Hướng giải quyết và kế hoạch thực hiện………8
1.2.1 Hướng giải quyết………8
1.2.2 Kế hoạch thực hiện……….8
CHƯƠNG II: CƠ SỞ LÝ THUYẾT……….9
2.1 Các khái niệm sử dụng trong đề tài………9
2.1.1 Đồ thị vô hướng……… …… 9
2.1.2 Đồ thị liên thông……….9
2.1.3 Cây và cây khung………9
CHƯƠNG III: KẾT QUẢ ỨNG DỤNG……….10
3.1 Phân tích yêu cầu bài toán, xây dựng các cấu trúc dữ liệu cần thiết…10 3.1.1 Phân tích yêu cầu bài toán……… 10
3.1.2 Xây dựng các cấu trúc dữ liệu cần thiết……… 10
3.2 Thiết kế giải thuật (lưu đồ - ngôn ngữ giả)……… 11
3.2.1 Nhập ma trận trọng số……… 11
3.2.2 In ma trận……….12
3.2.3 In các đỉnh đã duyệt (S)……… 12
3.2.4 Kiểm tra……… 12
3.2.5 In cạnh cây khung………13
3.2.6 In đỉnh kề……….13
3.2.7 Giải thuật Prim……….14
3.3 Giới thiệu chương trình……….17
3.3.1 Giao diện chính của chương trình………17
3.3.2 Nhập đồ thị(bằng ma trận trọng số)……….18
3.3.3 Tìm cây khung có trọng lượng nhỏ nhất trên đồ thị………18
CHƯƠNG IV: KẾT QUẢ - ĐÁNH GIÁ……… 19
4.1 Kết quả đạt được……… …… 19
4.2 Những hạn chế - nguyên nhân……… 19
4.2.1 Hạn chế………19
4.2.2 Nguyên nhân……… 19
4.3 Hướng phát triển……… 20
TÀI LIỆU THAM KHẢO……… ……….21
Trang 6Bài toán về cây bao trùm là một trong những ứng dụng quan trọng của lý thuyết đồ thị.
Bài toán tìm cây khung có trọng lượng nhỏ nhất là điển hình của vấn đề tìm cây khung Nhiều bài toán thực tế khác nhau đã được đưa về bài toán dạng này,
mà nội dung cơ bản là: tìm cây khung có trọng lượng nhỏ nhất của một đồ thị vô hướng liên thông Hiện nay yêu cầu thực tế của các bài toán tìm cây khung rất đa dạng và có rất nhiều phương pháp khác nhau để giải Tuy nhiên phương pháp dựa trên lý thuyết đồ thị là phương pháp thực sự có hiệu quả để giải các bài toán dạng này
Ngày nay, Tin học ngày càng trở nên quan trọng, nó đã xâm nhập vào rấtnhiều ngành, lĩnh vực như: y tế, giáo dục, quốc phòng Sự kết hợp giữa lýthuyết đồ thị và tin học sẽ nâng cao hơn nữa vai trò của chúng trong các ứng dụngthực tiễn của đời sống xã hội hiện đại
Sự mô hình hoá của bài toán tìm cây khung có trọng lượng nhỏ nhất nêu
trên là một ví dụ điển hình về việc áp dụng tin học vào toán học
Tuy nhiên, bên cạnh những ưu điểm của nó còn có một số hạn chế là vìkhông phải lúc nào cũng có thể mô phỏng một bài toán nào đó bằng tin học Vàviệc mô phỏng này cũng khá phức tạp nên chưa được áp dụng rộng rãi trong thực
tế Hy vọng rằng trong thời buổi công nghệ thông tin hiện nay thì vấn đề này sẽđược áp dụng một cách phổ biến hơn Đề tài này đã thật sự cuốn hút tôi, và tôi đã
chọn để thực hiện Niên Luận 1.
Dù đã cố gắng thật nhiều, nhưng chắc chắn rằng tôi sẽ còn nhiều thiếu sót.Rất mong được sự góp ý của Thầy và bạn bè để đề tài này được hoàn thiện hơn.Xin chân thành cảm ơn
Cần Thơ, tháng 4 năm 2010 Sinh viên thực hiện
Võ Thị Tú
Trang 7CHƯƠNG I
TỔNG QUAN
1.1 MÔ TẢ BÀI TOÁN, MỤC TIÊU VÀ PHẠM VI CẦN ĐẠT ĐƯỢC
1.1.1 Mô tả bài toán:
Lý thuyết Đồ thị - một cấu trúc rời rạc tìm được những ứng dụng rộng rãitrong nhiều lĩnh vực của khoa học kỹ thuật và đời sống - là một trong nhữngngành khoa học ra đời khá sớm Lý thuyết Đồ thị giúp mô tả hình học và giảiquyết nhiều bài toán thực tế phức tạp liên quan đến các khái niệm như: đường đingắn nhất, chu trình, cây bao trùm… bằng các thuật toán ngắn gọn và thú vị
Bên cạnh đó, Tin học cũng ngày càng quan trọng trong đời sống, nhữngứng dụng của nó giúp con người giảm đi một khối lượng công việc rất lớn, giúpcông việc được giải quyết nhanh hơn Đối với lý thuyết đồ thị, tin học giúp nângcao hơn nữa vai trò của lý thuyết đồ thị trong các ứng dụng thực tiễn khi cài đặtcác thuật toán trên máy tính
Bài toán tìm cây khung có trong lượng nhỏ nhất là một trong những bàitoán ứng dụng quan trọng của lý thuyết đồ thị
1.1.2 Mục tiêu cần đạt được
Ngôn ngữ sử dụng: Tùy chọn ngôn ngữ trong họ C để cài đặt tốt cácchương trình
Trình bài khái niệm về đồ thị, tính liên thông, cây và cây khung
Trình bày giải thuật Prim, ví dụ minh họa
Mô phỏng được hoạt động của giải thuật Prim
Hiển thị kết quả về cây khung có trọng lượng nhỏ nhất của một đồthị bất kỳ
Trang 81.2 HƯỚNG GIẢI QUYẾT VÀ KẾ HOẠCH THỰC HIỆN
1.2.1 Hướng giải quyết:
Dùng ngôn ngữ C để thiết kế chương trình
Thuật toán Prim được thiết kế nhằm giải bài toán tìm cây khung có trọnglượng nhỏ nhất của một đồ thị vô hướng với trọng số không âm Áp dụng giảithuật Prim để tìm cây khung có trọng lượng nhỏ nhất trên một đồ thị vô hướng
1.2.2 Kế hoạch thực hiện:
Tuần 8 : Phân tích và tìm hiểu đề tài
Tuần 9 : Thiết kế giải thuật
Tuần 10 : Hiệu chỉnh giải thuật
Tuần 11 : Hiệu chỉnh giải thuật – Cài đặt DEMO
Tuần 12 - 13: Hiệu chỉnh chương trình – Viết báo cáo
Tuần 14 : Hoàn tất niên luận – Nộp báo cáo
Trang 9CHƯƠNG II
CƠ SỞ LÝ THUYẾT
2.1 CÁC KHÁI NIỆM SỬ DỤNG TRONG ĐỀ TÀI
2.1.1 Đồ thị vô hướng:
Đồ thị vô hướng ký hiệu G = (X, U) , trong đó:
o X là một tập hợp mà các phần tử của nó được gọi là các đỉnhcủa đồ thị
o U là một tập hợp mà các phần tử của nó là các cặp đỉnh khôngtính đến thứ tự u = (i, j) = (j, i), gọi là cạnh nối giữa đỉnh i vàđỉnh j của đồ thị
2.1.3 Cây và cây khung:
Cây là một đồ thị vô hướng liên thong và không có chu trình
Cây khung trên đồ thị vô hướng G là một đồ thị bộ phận liên thôngkhông có chu trình của G
Trang 10CHƯƠNG III
KẾT QUẢ ỨNG DỤNG
3.1 PHÂN TÍCH YÊU CẦU BÀI TOÁN, XÂY DỰNG CÁC CẤU TRÚC
DỮ LIỆU CẦN THIẾT
3.1.1 Phân tích yêu cầu bài toán:
Vận dụng các lý thuyết cơ bản về đồ thị để cài đặt chương trình chophép biểu diễn đồ thị, kiểm tra tính liên thông và tìm cây khung có trọnglượng nhỏ nhất bằng giải thuật Prim
3.1.2 Xây dựng các cấu trúc dữ liệu cần thiết:
#define max 50: khai báo giá trị vô cùng của mảng (cả một và hai chiều) –mảng tối đa là 50 phần tử
MT[max][max]: ma trận trọng số - biểu diễn cho đồ thị cần tìm
min=1000: giá trị vô cùng của trọng số là 1000
DK[3][max]: Ma trận chứa đỉnh kề
S[max]: Mảng chứa các đỉnh đã duyệt
T[2][max]: Ma trận cạnh của cây khung
W: Trọng lượng của cây khung
NhapMT(): Đọc đồ thị bằng ma trận trọng số
InMT(): In ma trận trọng số vừa nhập
InS(): In các đỉnh đã duyệt
InDK(): In đỉnh kề và trọng số tương ứng
InT(): In các cạnh của cây khung tìm được
Kiemtra(): kiểm tra xem đỉnh kề đang xét thuộc S hay không
Prim(): Tìm cây khung có trọng lượng nhỏ nhất trên đồ thị vừa nhập
main(): chương trình chính
Ngoài ra, còn sử dụng các cấu trúc rẽ nhánh if, if – else để thực hiện côngviệc Vòng lặp for, while
Trang 113.2 THIẾT KẾ GIẢI THUẬT (LƯU ĐỒ - NGÔN NGỮ GIẢ)
a[i][j]=0
j=ii<=n
Trang 12Đúng
Đúng
begini=1
j=1i<=n
S[i]=
=x
kt= 1break
kt =0
Trang 143.2.7 Giải thuật Prim:
- Biểu diễn đồ thị bằng ma trận trọng số
- Bài toán: Cho đồ thị vô hướng G liên thông với tậpcạnh T và hàm trọng số W Tìm cây bao trùm G’ của
G sao cho tổng trọng số các cạnh của G’ đạt giá trị nhỏnhất
S[]: mảng lưu các đỉnh đã duyệt
T[2][]: ma trận lưu cạnh cây khung vừa tìmđược
DK[3][]: ma trận lưu đỉnh kề của các phần tửthuộc S và trọng số của chúng
Kiemtra(): kiểm tra xem đỉnh kề đang xét cóthuộc S hay không
W: trọng lượng cây khung – khởi tạo W=0
min: trọng lượng của cạnh nhỏ nhất – khởi tạomin=1000
count: biến đếm số phần tử trong DK – khởi tạocount=0
dem: biến đếm số phần tử trọng S – khởi tạodem=1
Trang 15Sai Đúng
SaiĐúng
Sai Đúng
Đúng
Sai
BeginNhập n
DK[1][count]= iDK[2][count]=MT[S[k][i]]
count++
i++
Trang 16Đúng
j=0
j<count
S[dem]=tcount=0min=1000dem++
Xuất S, W,
T
Trang 173.3 GIỚI THIỆU CHƯƠNG TRÌNH
Chương trình được cài đặt bằng ngôn ngữ C, với giao diện chính như sau:
3.3.1 Giao diện chính của chương trình:
Ví dụ: Đồ thị gồm 5 đỉnh và 10 cạnh như hình vẽ
1 15 3
4
20
3 3 1
2
2
1
3 2
Trang 183.2.2 Nhập đồ thị (bằng ma trận trọng số):
Nhập số đỉnh của đồ thị: nhập từ bàn phím là 5 Lần lượt nhập 10 cạnh vàtrọng số của 10 cạnh
3.3.3 Tìm cây khung có trọng lượng nhỏ nhất trên đồ thị:
Nhập đỉnh bắt đầu: giả sử ta bắt đầu từ đỉnh 1
Trang 19CHƯƠNG IV
KẾT LUẬN – ĐÁNH GIÁ
4.1 KẾT QUẢ ĐẠT ĐƯỢC
Với sự hướng dẫn tận tình của Thầy và sự giúp đỡ của bạn bè Hômnay, niên luận 1 cơ bản đã được hoàn thành và đạt được một số kết quả nhưsau:
o Hiểu, thiết lập được thuật toán và viết chương trình dựa vàothuật toán đã thiết lập
o Chương trình đã giải quyết được về cơ bản những yêu cầuđặt ra Chương trình chạy khá ổn định nhập dữ liệu từ bàn phím
o Chương trình được thiết kế bằng thuật toán đơn giản, dễ hiểunên dễ dàng kiểm tra và sửa chữa khi có yêu cầu chỉnh sửa
o Biết cách trình bày một báo cáo khoa học đúng theo yêu cầu
4.2 NHỮNG HẠN CHẾ - NGUYÊN NHÂN
4.2.1 Hạn chế:
Là sinh viên như chúng em, kinh nghiệm tích luỹ chưa có nhiều, khả năngtiếp xúc thực tế còn rất ít Hơn nữa, đây là lần đầu tiên viết một chương trình hoànchỉnh nên vẫn còn thiếu nhiều kinh nghiệm trong kỹ thuật lập trình cũng như trongcách lý luận để đưa ra cơ sở giải quyết cho bài toán Do đó, chương trình cũng cònnhiều thiếu sót:
o Chương trình chỉ cho phép đọc đồ thị từ bàn phím và không lưu lạiđược kết quả
o Chưa kiểm tra tính liên thong của đồ thị
o Phần hiển thị giao diện chưa có đồ họa nên không hiển thị đồ thị vàchưa hiển thị cây khung có trọng lượng nhỏ nhất trên đồ thị vô hướngđang xét
4.2.2 Nguyên nhân:
Do thiếu kinh nghiệm trong kỹ thuật lập trình, tổ chức dữ liệu… hạn chế vềthời gian và kiến thức nên còn một số sai sót ngoài ý muốn
Trang 204.3 HƯỚNG PHÁT TRIỂN
Để chương trình được hoàn thiện hơn, cần cố gắng khắc phục những hạnchế trên Và cần sử dụng kỹ thuật đồ họa thiết kế giao diện đồ họa để minh họa bàitoán một cách rõ ràng và sinh động hơn Cần sử dụng tập tin để đọc đồ thị nhanhhơn và dể chỉnh sữa hơn
Cài đặt chương trình kiểm tra tính liên thong Nếu đồ thị có nhiều bộ phậnliên thông xác định các bộ phận liên thong và tìm cây khung trên từng bộ phận liênthông
Ở đây, có thể dùng ngôn ngữ Delphi, C, Visual Basic, C++,…, để thiết kếgiao diện đồ họa
Trang 21[1] TOÁN RỜI RẠC 2 – KHOA CNTT&TT – ĐẠI HỌC CẦN THƠ 2009
[2] ThS TRƯƠNG VĂN CHÍ CÔNG – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
C++ - KHOA CNTT&TT – ĐẠI HỌC CẦN THƠ 12/2003
[3] NGUYỄN CÔNG DANH THỰC HÀNH LẬP TRÌNH CĂN BẢN A
-KHOA CNTT&TT - ĐẠI HỌC CẦN THƠ 2008
[4] NGUYỄN VĂN LINH, TRẦN CAO ĐỆ, TRƯƠNG THỊ THANH
TUYỀN, LÂM HOÀI BẢO, PHAN HUY CƯỜNG, TRẦN NGÂN
BÌNH - CẤU TRÚC DỮ LIỆU - KHOA CNTT&TT - ĐẠI HỌC CẦN
THƠ 12/2003
[5] http://www.google.com