Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứng dụng trong ngành công nghệ thông tin. Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sỹ: Leonhard Euler. Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về 7 cái cầu ở thành phố Konigberg.Lý thuyết đồ thị có rất nhiều bài toán được ứng dụng có hiệu quả trong nhiều lĩnh vực. Một trong những bài toán đó chính là bài toán tìm cây phủ của đồ thị.Để ứng dụng phần lý thuyết đã học về Toán ứng dụng vào trong đề tài của tiểu luận, em trình bày hai vấn đề :Thuật toán tìm cây phủ của đồ thị theo chiều ngang.Áp dụng thuật toán trên cho đồ thị không liên thông.
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG
ĐÀ NẴNG, 06/2015
Trang 2LỜI MỞ ĐẦU
Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứngdụng trong ngành công nghệ thông tin Những tư tưởng cơ bản của lý thuyết đồ thịđược đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người ThụySỹ: Leonhard Euler Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng
về 7 cái cầu ở thành phố Konigberg
Lý thuyết đồ thị có rất nhiều bài toán được ứng dụng có hiệu quả trong nhiềulĩnh vực Một trong những bài toán đó chính là bài toán tìm cây phủ của đồ thị
Để ứng dụng phần lý thuyết đã học về Toán ứng dụng vào trong đề tài củatiểu luận, em trình bày hai vấn đề :
Thuật toán tìm cây phủ của đồ thị theo chiều ngang
Áp dụng thuật toán trên cho đồ thị không liên thông
Em xin chân thành cảm ơn thầy PGS.TSKH Trần Quốc Chiến đã hướng
dẫn và cung cấp kiến thức và tài liệu để em có thể hoàn thành tiểu luận này
Học viên thực hiện
Nguyễn Trọng Ân
Trang 3MỤC LỤC
LỜI MỞ ĐẦU 2
CHƯƠNG I 1
ĐẠI CƯƠNG VỀ ĐỒ THỊ 1
CÂY 1
I.Định nghĩa 1
1 Định nghĩa 1 1
2 Định nghĩa 2 1
3 Định nghĩa 3 2
2 2 II.Tính chất 2
1 Định lý 1 (Định lý tương đương) 2
2 Định lý 2 2
III.Cây m-phân 3
1 Định nghĩa 3
2 Định lý 1 3
3 Hệ quả 3
4 Định lý 2 3
CÂY PHỦ 3
I.Định nghĩa 4
II.Định lý 4
4 CHƯƠNG II 5
BÀI TOÁN TÌM CÂY PHỦ THEO CHIỀU NGANG 5
I.Giới thiệu bài toán 5
CHƯƠNG III 6
THIẾT KẾ VÀ CÀI ĐẶT BÀI TOÁN 6
I.Thuật toán 6
II.Thiết kế cấu trúc dữ liệu 6
1.Dữ liệu đầu vào 6
2.Dữ liệu đầu ra 6
3.Hàng đợi Q 7
4.Cây phủ SpanningTree 7
Trang 4III.Áp dụng thuật toán cho đồ thị không liên thông 8
1.Ý tưởng 8
IV.Cài đặt bài toán 8
KẾT LUẬN 16
TÀI LIỆU THAM KHẢO 17
Trang 5Gốc của cây là một đỉnh đặc biệt, thông thường là đỉnh trên cùng.
Mức của đỉnh là độ dài đường đi từ gốc lên đỉnh đó.
Độ cao của cây là mức lớn nhất của cây ( tức mức của đỉnh cách xa gốc nhất).
Trong ví dụ trên nếu ta chọn v1 là gốc thì v2, v3 là những định mức 1, các đỉnh v4, v5,
v6, v7 có mức 2, và độ cao của cây là 2
Trang 6y là hậu thế của x, nếu x là tiền bối của y
y và z là anh em nếu chúng đều là con của đỉnh x
x là đỉnh lá nếu nó không có con
x là đỉnh trong của cây nếu nó có con
T liên thông và mỗi cạnh là cầu
Hai đỉnh bất kỳ được nối với nhau bởi một đường đi duy nhất
T không chứa chu trình và nếu thêm một cạnh nối hai đỉnh thì ta thu được đúng 1 chu trình
T liên thông và nếu them một cạnh nối hai đỉnh thì ta thu được đúng 1 chu trình
2 Định lý 2
Tâm của cây là tập hợp hoặc chỉ có một đỉnh hoặc có hai đỉnh kề nhau
Trang 7III Cây m-phân
1 Định nghĩa
Cây m-phân ( m ∈N*) là cây mà mọi đỉnh trong có tối đa m con và có ít nhấtmột đỉnh có m con
Cây m-phân đầy đủ là cây mà mọi đỉnh trong có đúng m con
Cây cân bằng là cây mà mọi đỉnh lá có mức là h hay h-1, trong đó h là chiều
cao của cây
Cho T là cây m-phân có l lá và chiều cao h khi đó
Nếu T là cây m-phân cân bằng đầy đủ thì h= [logml]
Trong đó [x] (trần nguyên của x) ký hiệu số nguyên nhỏ nhất lớn hơn hoặc bằng x
CÂY PHỦ
3
Trang 9CHƯƠNG II
BÀI TOÁN TÌM CÂY PHỦ THEO CHIỀU
NGANG
I Giới thiệu bài toán
Cho một đồ thị bất kỳ, hãy tìm cây phủ của đồ thị Đầu vào của bài toán là tập các thông tin về số cạnh, số đỉnh cũng như các cạnh trong đồ thị Đầu ra của bài toán là tập các thông tin về số thành phần liên thông, các đinh cũng như các cạnh phủ của từng đồ thị liên thông của đồ thị
5
Trang 10Đầu vào: Đồ thị G=(V,E)
Đầu ra: Cây phủ T hoặc kết luận đồ thị không liển thong
Rút đỉnh x ∈ Q Duyệt các đỉnh y ∈ Ke(x), nếu y ∉ T thì thêm cạnh (x,y) và
đỉnh y vào T và đẩy y vào hàng đợi Q
Nếu Q ≠ ∅ và T chưa phủ hết các đỉnh, thì quay lại bước 2, ngược lại sang bước 3
(3) Kết luận:
Nếu T phủ hết các đỉnh của đồ thị, thì T là cây phủ, ngược lại đồ thị không liên thông
II Thiết kế cấu trúc dữ liệu
1 Dữ liệu đầu vào
File dữ liệu đầu vào: GRAPH.INP có cấu trúc
Trang 11File kết quả: GRAPH.OUT
x1, , xi {các đỉnh của thành phần liên thông thứ 1}
(u1, v1),(u2, v2), {các cạnh cây phủ của thành phần liên thông thứ 1}
y1, , yj {các đỉnh của thành phần liên thông thứ 2}
(r1, t1), (r2, t2), … {các cạnh cây phủ của thành phần liên thông thứ 2
3 Hàng đợi Q
Hàng đợi Queue có 5 thuộc tính:
- Capacity: kiểu integer, chỉ số phần tử tối đa mà queue có thể chứa
- Size: kiểu integer, chỉ số phần tử hiện tại mà queue chứa
- Front: kiểu integer, chỉ vị trí phần tử đầu tiên của queue
- Rear: kiểu integer, chỉ vị trí phần tử sau cùng của queue
4 Cây phủ SpanningTree
Cây phủ Cây phủ SpanningTree có 4 thuộc tính:
- mT: kiểu mảng integer, chỉ tập hợp các đỉnh đã duyệt qua
- mCount: kiểu integer, chỉ số phần tử của mảng mT
Trang 12- mSpanningEdges: kiểu mảng hai chiều integer, chỉ tập hợp các cạnh phủ đã
- mCountSpanningEdges: kiểu integer, chỉ số phần tử của mảng
mSpanningEdges
Kết quả của bài toán là tập các cây phủ SpanningTree, nếu số phần tử của tập này
là 1 thì đồ thị có cây phủ, ngược lại lớn hơn 1, đồ thị không liên thông và tập này là tập rừng phủ của đồ thị
III Áp dụng thuật toán cho đồ thị không liên thông
1 Ý tưởng
Đối với bài toán đúng tức là đồ thị liên thông, khi duyệt hết các đỉnh và các cạnh và hàng đợi Q rỗng, ta kiểm tra tập đỉnh trong T đã phủ đồ thị hết chưa bằng cách so sánh số lượng phần tử của T(countT) và số đỉnh của đồ thị(n)
countT == n
Nếu đúng thì trả về true, tức là đồ thị liên thông và có tập phủ Ngược lại, trả
về false, đồ thị không liên thông
Nếu đồ thị không liên thông, ta đi tìm rừng phủ cho đồ thị theo các bước sau:
(1) Thêm tập T kết quả vào tập các cây phủ SpanningTree Trong tập các
cạnh đầu vào của hàm tìm cây phủ, loại các cạnh chứa đỉnh đã tồn trong tập T
(2) Gọi hàm tìm cây phủ với tập các cạnh đầu vào mới có, nếu kết quả trả về false, lặp lại bước 1, ngược lại sang bước 3
(3) Thêm tập T kết quả vào tập các cây phủ SpanningTree Kết thúc
IV Cài đặt bài toán
Trang 13(the index at which we insert the element) */
typedef struct Queue
Trang 14/* createQueue function takes argument the maximum number of elements the Queue can hold, creates
a Queue according to it and returns a pointer to the Queue */
Queue * CreateQueue(int maxElements)
{
/* Create a Queue */
Queue *Q;
Q = (Queue *)malloc(sizeof(Queue));
/* Initialise its properties */
Q->elements = (int *)malloc(sizeof(int)*maxElements);
Trang 16void WriteToAFile(SpanningTree ST[], int countST){
Trang 17//printf("Dang duyet nextVertice %d\n", nextVertice);
SpanningEdges[countSpanningEdges][0]=a[i][0];SpanningEdges[countSpanningEdges++][1]=a[i][1];
Enqueue(Q, nextVertice);
}}
Trang 18int main()
{
printf("***********************************************\n");
printf("\n");
printf("TIM CAY PHU THEO CHIEU NGANG\n");
printf("Hoc vien: NGUYEN TRONG AN\n");
Trang 20KẾT LUẬN
Em đã nắm bắt được một phần lý thuyết cơ bản về đồ thị toán ứng dụng
Xây dựng được thuật toán tìm cây phủ theo chiều ngang
Áp dụng thuật toán cho bài toán đồ thị không liên thông
Trang 21TÀI LIỆU THAM KHẢO
[1] PGS.TSKH Trần Quốc Chiến – Bài Giảng Toán Ứng Dụng – Trường Đại Học
Bách Khoa Đà Nẵng - 2015
[2] Các tài liệu trên Internet
17