Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
211,35 KB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN LẬP TRÌNH TÍNH TỐN ĐỀ TÀI CÂY PHỦ VÀ THUẬT TỐN TÌM CÂY PHỦ THEO CHIỀU SÂU NGƯỜI HƯỚNG DẪN : ThS NGUYỄN VĂN NGUYÊN SINH VIÊN THỰC HIỆN : NHĨM PHAN ĐÌNH PHÚC LỚP: 20TCLC_DT5 ĐỒN QUỐC LỚP: 20TCLC_DT5 Đà Nẵng, 06/2021 LỜI CẢM ƠN Để hoàn thành báo cáo trước hết, chúng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Văn Nguyên, tận tình hướng dẫn, giải đáp khúc mắc, giúp chúng em hồn thành đồ án Đồng thời chúng em xin chân thành cảm ơn thầy cô Khoa công nghệ Thông tin – Đại học Bách Khoa Các thầy cô truyền đạt nhiều kiến thức bổ ích, tạo điều kiện để chúng em thực đồ án Vì kiến thức kinh nghiệm cịn hạn chế nên báo cáo tránh khỏi thiếu sót, chúng em mong nhận ý kiến đóng góp thầy, để em học thêm nhiều kinh nghiệm hoàn thiện tốt lần thực đồ án Sau cùng, em xin kính chúc q thầy khoa Cơng nghệ thông tin thật dồi sức khỏe, niềm tin để tiếp tục truyền đạt kiến thức cho hệ mai sau Chúng em xin chân thành cảm ơn! MỤC LỤC MỤC LỤC DANH MỤC HÌNH VẼ .4 MỞ ĐẦU TỔNG QUAN ĐỀ TÀI CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng .7 2.2 Cơ sở lý thuyết TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TỐN 3.1 Phát biểu tốn 3.2 Cấu trúc liệu 3.3 Thuật toán CHƯƠNG TRÌNH VÀ KẾT QUẢ 10 4.1 Tổ chức chương trình 10 4.2 Ngôn ngữ cài đặt .11 4.3 Kết 11 4.3.1 Giao diện chương trình 11 4.3.2 Kết thực thi chương trình 11 4.4 Nhận xét đánh giá .13 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN .13 5.1 Kết luận .13 5.2 Hướng phát triển .13 TÀI LIỆU THAM KHẢO 14 PHỤ LỤC 15 DANH MỤC HÌNH VẼ Hình 1: Mơ tả danh sách kề Hình 2: Giao diện lúc chạy chương trình .10 Hình 3: Kết chương trình cửa sổ đồ họa 11 Hình 4: Đầu vào đầu chương trình 11 Đồ án lập trình tính tốn MỞ ĐẦU Mục đích thực đề tài Củng cố, tìm hiểu bổ sung thêm kiến thức môn học Từ đó, bước đầu làm quen với việc nghiên cứu đồ án tạo chương trình đơn giản theo u cầu Ngồi cịn rèn luyện khả học làm việc theo nhóm - Mục tiêu đề tài Tìm hiểu nắm vững kiến thức liên quan đến nội dung đề tài Trình bày khái niệm phủ thuật tốn tìm phủ theo chiều sâu Xây dựng chương trình mơ tả thuật tốn tìm phủ theo chiều sâu Phạm vi đối tượng nghiên cứu Các kiến thức lý thuyết đồ thị, phủ, thuật tốn tìm khung Cách xây dựng chương trình mơ tả thuật tốn tìm phủ theo chiều sâu sử dụng đồ họa Phương pháp nghiên cứu Nghiên cứu tài liệu kết hợp với kiến thức học, củng cố cách thực hành theo hướng dẫn giảng viên Cấu trúc đồ án môn học Nội dung đồ án mơn học trình bày theo cấu trúc sau: Mở đầu Tổng quan đề tài Cơ sở lí thuyết: trình bày sở lí thuyết, ý tưởng Tổ chức cấu trúc liệu thuật toán: phát biểu toán, đầu vào đầu toán, cấu trúc liệu thuật tốn chương trình Chương trình kết quả: tổ chức chương trình nhận xét, đánh giá Kết luận hướng phát triển Phụ lục Đồ án lập trình tính tốn TỔNG QUAN ĐỀ TÀI Cây phủ thuật tốn tìm phủ theo chiều sâu phần thuộc Lý thuyết đồ thị, mơn Tốn rời rạc Nó khái niệm quan trọng, tiền đề để xây dựng lời giải cho tốn tìm đường nhỏ hay tốn khác Từ ứng dụng việc xây dựng hệ thống đường, hệ thống mạng Để nắm kiến thức trình bày đồ án phủ thuật tốn tìm phủ theo chiều sâu Nhóm chúng em tiến hành nghiên cứu đề tài dựa yêu cầu sau: Trình bày khái niệm cây, phủ, định lí tương đương Trình bày thuật tốn tìm phủ theo chiều sâu Thiết kế cấu trúc liệu giải thuật tìm phủ theo chiều sâu Cài đặt thuật tốn tìm phủ theo chiều sâu ngôn ngữ C Kết DEMO: 10 test Đồ án lập trình tính tốn CƠ SỞ LÝ THUYẾT 2.1 Ý tưởng Chương trình tìm phủ theo chiều sâu thực với đầu vào có dạng danh sách liên kết đơn, danh sách biểu diễn đỉnh kề đỉnh (danh sách kề) Sau đầu vào xử lí thực thuật tốn tìm phủ Đầu chương trình hai mảng đánh số từ đến n (với n số cạnh phủ) Hai mảng biểu diễn n cặp phần tử, cặp phần tử thứ i hai đỉnh cạnh thứ i phủ 2.2 Cơ sở lý thuyết Các khái niệm liên quan: Đồ thị: cấu trúc rời rạc gồm đỉnh cạnh nối đỉnh đó, mơ tả hình thức dạng G = (V, E) Trong V tập đỉnh (vertices) E tập cạnh (edges) Đồ thị vô hướng: đồ thị dạng G = (V, E) có cạnh nối hai đỉnh với nhau, không phân biệt thứ tự hai đỉnh đầu mút Trường hợp cạnh có phân biệt thứ tự hai đỉnh đầu mút gọi đồ thị có hướng Cây: đồ thị vô hướng liên thông chu trình Trong tin học, sử dụng để xây dựng thuật toán tổ chức thư mục, thuật toán cất giữ, truyền liệu tìm kiếm Cây phủ (cây khung, bao trùm): phủ đồ thị vô hướng liên thông bao gồm toàn đỉnh đồ thị Cây phủ ứng dụng thuật tốn tìm đường hay để giải toán hệ thống mạng, hệ thống đường dây… Các định lí tương đương: Cho G = (V, E) đồ thị vơ hướng có n đỉnh Khi mệnh để sau tương đương với nhau: G G khơng có chu trình có n – cạnh G liên thơng có n – cạnh G liên thông bỏ cạnh G khơng liên thơng Hai đỉnh G nối với đường G khơng có chu trình thêm vào cạnh nối hai đỉnh khơng kề thu chu trình Đồ án lập trình tính tốn TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN 3.1 Phát biểu tốn Cho đồ thị vơ hướng liên thơng dạng danh sách kề Tìm phủ đồ thị thuật tốn tìm kiếm theo chiều sâu Đầu vào: Dòng thể số đỉnh N đồ thị cần xét N dòng thể danh sách kề đồ thị Dòng thứ N biểu diễn danh sách đỉnh kề với đỉnh thứ N đồ thị Đầu ra: N-1 dòng biểu diễn cạnh khung Mỗi dòng gồm chữ số tương ứng với đỉnh đầu đỉnh cuối cạnh Ví dụ: Đầu vào Đầu 12 24 23 134 24 12 Bảng 1: Mô tả đầu vào đầu chương trình 3.2 Cấu trúc liệu Đồ thị toán cho cấu trúc liệu kiểu Danh sách kề (Adjacency list): Mỗi đỉnh đồ thị có danh sách liên kết đơn thể đỉnh kề (nghĩa có cạnh nối từ đỉnh đến đỉnh đó) Trong đồ thị vơ hướng, cấu trúc gây trùng lặp Chẳng hạn đỉnh nằm danh sách đỉnh đỉnh phải có danh sách đỉnh Tùy trường hợp chọn cách sử dụng phần khơng gian thừa, liệt kê quan hệ kề cạnh lần Biểu diễn liệu thuận lợi cho việc từ đỉnh tìm đỉnh nối với nó, đỉnh liệt kê tường minh Đồ án lập trình tính tốn NULL NULL NULL NULL Hình 1: Mơ tả danh sách kề Trong chương trình, danh sách kề thể cấu trúc: typedef struct Dinh{ int ChiSoDinh; Dinh *next; }Dinh; Với n đỉnh có đồ thị, ta tạo n danh sách liên kết đơn Khi đọc đỉnh file input, ta tạo phần tử thêm vào cuối danh sách Biến ChiSoDinh thể đỉnh kề trỏ *next trỏ đến đỉnh kề Nếu *next có giá trị NULL danh sách kết thúc 3.3 Thuật tốn Đầu vào: - Đồ thị vơ hướng liên thông G = (V, E) cho danh sách kề Tập cạnh T khung T := Ø Đỉnh xuất phát i Thuật tốn tìm phủ theo chiều sâu: Đồ án lập trình tính tốn Xetdinh(i): Chuaxet[i] = false For j thuộc Dinhke[i]: { If Chuaxet[j] == true { Thêm cạnh (i, j) vào T Xetdinh(j) } } Với For i = to SoDinh: Chuaxet[i] = true Đầu tiên, ta đánh dấu tất đỉnh đồ thị chưa xét Bắt đầu từ đỉnh i bất kì, ta thực bước: Đánh dấu đỉnh thời xét Duyệt tất đỉnh kề với đỉnh thời, đỉnh chưa xét: - Thêm cạnh nối đỉnh thời đỉnh kề vào phủ Thực hàm đệ quy để xét đỉnh kề Do thuật toán phải xét qua đỉnh cạnh đồ thị nên có độ phức tạp O(V + E) Với V số đỉnh E số cạnh đồ thị CHƯƠNG TRÌNH VÀ KẾT QUẢ 4.1 Tổ chức chương trình Chương trình xây dựng theo bố cục sau: Nhập tên file Đọc liệu đầu vào từ file Sử dụng thuật tốn tìm kiếm theo chiều sâu để xây dựng phủ In kết Kết thúc chương trình Ngồi ra, chương trình cịn sử dụng thư viện graphics.h để mô trực quan đồ thị phủ với hàm: Vẽ đỉnh đồ thị 10 Đồ án lập trình tính tốn Vẽ cạnh ban đầu đồ thị Vẽ cạnh phủ (kết quả) 4.2 Ngôn ngữ cài đặt Chương trình sử dụng ngơn ngữ C với thư viện: stdio.h, math.h, string.h, graphics.h 4.3 Kết 4.3.1 Giao diện chương trình Hình 2: Giao diện lúc chạy chương trình 4.3.2 Kết thực thi chương trình Mơ tả kết thực chương trình Sau xây dựng, chương trình trả kết sau: Ghi thông báo “Khơng tìm thấy file” khơng tìm thấy file đường dẫn Trả kết cạnh phủ, đồng thời vẽ đồ thị ban đầu phủ kết chương trình thực thành cơng 11 Đồ án lập trình tính tốn Hình 3: Kết chương trình cửa sổ đồ họa Hình 4: Đầu vào đầu chương trình 12 Đồ án lập trình tính tốn 4.4 Nhận xét, đánh giá Chương trình đạt yêu cầu đặt Có thể thực u cầu tìm phủ theo chiều sâu với liệu lấy từ file Ngoài chương trình cịn biểu diễn đầu vào đầu cách trực quan dạng hình vẽ KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 Kết luận Trải qua thời gian nghiên cứu thực đề tài, nhóm chúng em có hiểu biết đề tài Từ hồn thiện đồ án “Cây phủ thuật tốn tìm phủ theo chiều sâu”, đáp ứng yêu cầu đề tài tạo chương trình để thực thuật tốn Bên cạnh chúng em cịn học luyện tập quy trình thực báo cáo, đồ án để thực tốt đồ án sau 5.2 Hướng phát triển Chương trình mở rộng theo nhiều hướng cho phép người dùng lựa chọn loại thuật toán khác nhau, kiểu nhập liệu đầu vào từ file thủ công, kết xuất file riêng… Ngồi ra, chương trình cịn nâng cấp thành giao diện cửa sổ cho phép người dùng chỉnh sửa đồ thị, giúp cho việc sử dụng chương trình dễ dàng thuận tiện 13 Đồ án lập trình tính tốn TÀI LIỆU THAM KHẢO [1] Tốn Rời Rạc Nguyễn Đức Nghĩa – Nguyễn Tô Thành [2] Bài giảng Cấu trúc liệu – Trường Đại Học Bách Khoa Đà Nẵng, Khoa Công nghệ thông tin [3] Bài giảng Toán rời rạc – Ths Phan Thanh Tao 14 Đồ án lập trình tính tốn PHỤ LỤC Mã nguồn chương trình: #include #include #include #include #define PI 3.14 typedef struct Dinh{ int ChiSoDinh; Dinh *next; }Dinh; Dinh *taoDinh(); void nhapTenFile(char tenFile[]); void docDuLieuDauVao(Dinh **dinh, int *SoDinh, FILE *input); void inKetQua(int DinhDau[], int DinhDuoi[], int SoDinh); void DFS(Dinh *dinh, int ChuaXet[], int i, int DinhDau[], int DinhDuoi[],int *dem); void veCanhBanDau(Dinh *dinh, int SoDinh, int x[], int y[]); void veCanhKetQua(int DinhDau[], int DinhDuoi[], int SoDinh, int x[], int y[]); void veDoThi(Dinh *dinh, int SoDinh, int xTT, int yTT, int x[], int y[]); void veCanh(int x1, int y1, int x2, int y2); Dinh *taoDinh() { Dinh *dinhMoi = (Dinh*)malloc(sizeof(Dinh)); dinhMoi->next = NULL; return dinhMoi; } 15 Đồ án lập trình tính tốn void docDuLieuDauVao(Dinh **dinh, int *SoDinh, FILE *input) { char str[100], *s; fscanf(input, "%d", &(*SoDinh)); printf("So dinh: %d\n", *SoDinh); fseek(input, SEEK_CUR+1, SEEK_CUR); //cho tro ao file xuong dong *dinh = (Dinh*)malloc(pow(*SoDinh, 2) * sizeof(Dinh)); printf("Danh sach ke: \n"); for(int i=1; i ChiSoDinh = i; //tao tro temp de giu (*dinh+i) la Dinh *temp = (*dinh+i); //tro chi toi dau moi danh sach dinh ke i fgets(str, 1024, input); //doc dong file input, luu vao str s = str; printf("%d -> ", i); while(*s != ‘\n’) { Dinh *dinhMoi = taoDinh(); temp->next = dinhMoi; temp = dinhMoi; dinhMoi->ChiSoDinh = strtol(s, &s, 10); printf("%d -> ", dinhMoi->ChiSoDinh); } printf("NULL \n"); } } void veCanh(int x1, int y1, int x2, int y2) { setcolor(WHITE); //mau duong ke noi int r = 30; float DoDaiCanh = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)); float cosA = abs(x1 - x2) / DoDaiCanh; 16 Đồ án lập trình tính toán float sinA = abs(y1 - y2) / DoDaiCanh; int xTo = (x1 > x2) ? x1 : x2, xNho = (x1 < x2) ? x1 : x2; int yTo = (y1 > y2) ? y1 : y2, yNho = (y1 < y2) ? y1 : y2; if(x1 == x2) //duong noi co chieu | { if(y1 == yTo) line(x1, y1 - r, x2, y2 + r); else line(x1, y1 + r, x2, y2 - r); } else if(y1 == y2) //duong noi co chieu { if(x1 == xTo) line(x1 - r, y1, x2 + r, y2); else line(x1 + r, y1, x2 - r, y2); } else if((x1 < x2) && (y1 < y2) || (x1 > x2) && (y1 > y2)) //duong noi co chieu \ line(xTo – r * cosA, yTo – r * sinA, xNho + r * cosA, yNho + r * sinA); else if((x1 < x2) && (y1 > y2) || (x1 > x2) && (y1 < y2)) //duong noi co chieu / line(xNho + r * cosA, yTo – r * sinA, xTo – r * cosA, yNho + r * sinA); } void veCanhBanDau(Dinh *dinh, int SoDinh, int x[], int y[]) { int m, n; for(int i =1; i next != NULL) { temp = temp->next; m = (dinh+i)->ChiSoDinh; n = temp->ChiSoDinh; veCanh(x[m], y[m], x[n], y[n]); } } } 17 Đồ án lập trình tính tốn void veCanhKetQua(int DinhDau[], int DinhDuoi[], int SoDinh, int x[], int y[]) { int m, n; for(int i=1; i < SoDinh; i++) { m = DinhDau[i]; n = DinhDuoi[i]; veCanh(x[m], y[m], x[n], y[n]); } } void veDoThi(Dinh *dinh, int SoDinh, int xTT, int yTT, int x[], int y[]) { int r = 300, num = 1; //ban kinh thi, chi so dinh char str[10]; setbkcolor(LIGHTGRAY); //mau nen setfillstyle(SOLID_FILL, LIGHTGRAY); //cach to nen va mau to for(int i = 1; i char outtextxy(x[i]-12, y[i]-12, str); //ghi chi so dinh num++; } } void DFS(Dinh *dinh, int ChuaXet[], int i, int DinhDau[], int DinhDuoi[],int *dem) { int j, k=0; 18 Đồ án lập trình tính tốn ChuaXet[i] = 0; Dinh *temp = (dinh+i); while(temp->next != NULL) { temp = temp->next; j = temp->ChiSoDinh; if(ChuaXet[j] == 1) { k = ++*dem; DinhDau[k]=i; DinhDuoi[k]=j; DFS(dinh, ChuaXet, j, DinhDau, DinhDuoi, dem); } } } void inKetQua(int DinhDau[], int DinhDuoi[], int SoDinh) { printf("\nCac canh cua cay khung: \n"); for(int i = 1; i < SoDinh; i++) printf("Canh thu %d: %d - %d\n", i, DinhDau[i], DinhDuoi[i]); } void nhapTenFile(char tenFile[]) { printf("\n DO AN LAP TRINH TINH TOAN\n\n"); printf(" TIM CAY PHU THEO CHIEU SAU\n"); printf(" _\n\n"); printf("Nhap ten file (duoi txt): "); scanf ("%s", tenFile); system("cls"); } int main() { char tenFile[100]; 19 Đồ án lập trình tính tốn int SoDinh, xTT = 350, yTT = 350, dem=0; //xTT, yTT: toa trung tam thi int x[100], y[100], ChuaXet[100], DinhDau[100], DinhDuoi[100]; nhapTenFile(tenFile); FILE *input = fopen(tenFile,"r"); if (input == NULL) { printf("Loi khong tim thay file!"); return 0; } Dinh *dinh; docDuLieuDauVao(&dinh, &SoDinh, input); for(int i = 1; i