NIÊN LUẬN DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (DFS): Đối với cấu trúc dữ liệu thì nó cũng nghiên về phần lập trình. Nhưng ta thấy nó cũng có phần vẽ về đồ thị dể thông dụng hơn nhiều vì có nó sẽ làm ta có nhiều ý tưởng vẽ hơn. Do vậy, ta cũng có thể áp dụng phần vẽ đồ thị vào trong ngôn ngữ lập trình bằng đồ hoạ vậy ta sẽ thấy đẹp mắt hơn. Nói tới đồ thị thì gồm có 2 dạng đó là đồ thị có hướng và đồ thị vô hướng, biểu diễn đồ thị, các phép duyệt đồ thị.Và cũng trong số đó thì cũng có liên quan tới một phần em làm đó là: “Duyệt đồ thị theo chiều sâu”. Duyệt đồ thị theo chiều sâu là phải đi qua các đỉnh và các cạnh của đồ thị một cách có hệ thống. Và nó cũng có thể duyệt chiều sâu theo một hướng sâu nhất để tìm ra được kết quả chính xác hơn.
Trang 2Để hoàn thành niên luận này, bên cạnh sự nổ lực của bản thân cùng với sự kếthợp những kiến thức đã được học, quá trình tìm hiểu và thu thập thông tin có liênquan đến nội dung của đề tài niên luận Mặt khác chúng em luôn nhận được sự giúp
đỡ và hướng dẫn của cô Đã giúp em hoàn thành tốt niên luận này
Với sự nổ lực hết mình, em đã cố gắng hoàn thành niên luận này trong suốtthời gian qua Do vốn hiểu biết còn hạn chế nên vẫn còn nhiều thiếu xót Mong sự góp
ý kiến của cô để niên luận của em hoàn thiện hơn
Em xin chân thành cảm ơn!
Trang 3TÊN ĐỀ TÀI: DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (DFS)
GIÁO VIÊN HƯỚNG DẪN: TRIỆU …
CÁC SINH VIÊN THỰC HIỆN:
2
I HÌNH THỨC: (tối đa 1, 0 điểm)
Bìa: (tối đa 0.5 điểm)
Các tiêu đề:
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.5 điểm)
Trang nhận xét của GVHD và GV 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 kham khảo.
II NỘI DUNG: (tối đa 4.5 điểm)
II 1 Giới thiệu (tối đa 0.5 điểm)
Giới thiệu tổng quan
Mục tiêu cần đạt
II 2 Lý thuyết: (tối đa 1 đ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:
II 3 Ứng dụng: (tối đa 2.5 điểm)
Kết quả/Lưu đồ
Giới thiệu chương trình
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ế
Trang 4III CHƯƠNG TRÌNH ĐỀ MÔ: (tối đa 3.5 điểm)
Giao diện
Hướng dẫn sử dụng
Kết quả thực hiện đúng với kết quả phần ứng dụng
IV THƯỞNG: (tối đa 1.0 điểm)
TỔNG CỘNG:
Bạc Liêu, ngày tháng năm 20…
GV CHẤM
Trang 5
Bạc Liêu, ngày tháng năm 2010.
Giáo viên hướng dẫn
Trang 6MỤC LỤC
MỤC LỤC 1
CHƯƠNG I: TỔNG QUAN 2
I GIỚI THIỆU: 2
II MỤC TIÊU CẦN ĐẠT: 2
1 Về lý thuyết: 2
2 Về chương trình Demo: 2
III HƯỚNG PHÁT TRIỂN: 3
1 Hướng phát triển: 3
CHƯƠNG II: ỨNG DỤNG 4
I CƠ SỞ LÝ THUYẾT: 4
II CÁC KHÁI NIỆM VÀ CHƯƠNG TRÌNH CON: 4
1> Đồ thị: 4
2> Biểu diễn ma trận: 5
3> Đồ thị liên thông: 7
4> Duyệt chiều sâu (DFS): 9
5> Ngoài ra còn sử dụng các hàm được định nghĩa sẵn trong C và trong đồ hoạ: .11
III MÔ HÌNH, LƯU ĐỒ, CHƯƠNG TRÌNH CON VÀ KẾT QUẢ ĐẠT ĐƯỢC:12 1.Mô hình của chương trình chính: 12
2 Lưu đồ của một số chương trình: 13
3> Chương trình con và kết quả đạt được: 19
CHƯƠNG 3: KẾT LUẬN VÀ ĐÁNH GIÁ 24
I KẾT QUẢ ĐẠT ĐƯỢC: 24
II HẠN CHẾ: 25
III HƯỚNG PHÁT TRIỂN: 25
TÀI LIỆU THAM KHẢO 25
Trang 7CHƯƠNG I: TỔNG QUAN
I GIỚI THIỆU:
Ngày nay với sự phát triển mạnh mẽ của công nghệ, đặt biệt là ngành côngnghệ thông tin Trong lĩnh vực này, nó cũng liên quan không ít đến môn cấu trúc dữliệu và giải thuật Do đó, nó cũng là một phần quan trọng trong hệ thống thông tin
Đối với cấu trúc dữ liệu thì nó cũng nghiên về phần lập trình Nhưng ta thấy nócũng có phần vẽ về đồ thị dể thông dụng hơn nhiều vì có nó sẽ làm ta có nhiều ýtưởng vẽ hơn Do vậy, ta cũng có thể áp dụng phần vẽ đồ thị vào trong ngôn ngữ lậptrình bằng đồ hoạ vậy ta sẽ thấy đẹp mắt hơn Nói tới đồ thị thì gồm có 2 dạng đó là
đồ thị có hướng và đồ thị vô hướng, biểu diễn đồ thị, các phép duyệt đồ thị.Và cũngtrong số đó thì cũng có liên quan tới một phần em làm đó là: “Duyệt đồ thị theo chiềusâu” Duyệt đồ thị theo chiều sâu là phải đi qua các đỉnh và các cạnh của đồ thị mộtcách có hệ thống Và nó cũng có thể duyệt chiều sâu theo một hướng sâu nhất để tìm
ra được kết quả chính xác hơn
Đề tài này nói về mô hình hoá của đồ thị như: đọc File, vẽ đồ thị, in nội dungnút của giải thuật DFS
Để giải quyết các vấn đề trên, em quyết định dùng cấu trúc mảng
Trang 8- Cho phép nhập vào File, vẽ đồ thị bằng đồ hoạ, in nội dung núttheo giải thuật DFS.
- Trong phần vẽ đồ thị em có sử dụng hàm thư viện con chuột đểvẽ
III HƯỚNG PHÁT TRIỂN:
1 Hướng phát triển:
Qua quá trình nghiên cứu thực hiện niên luận có thể tóm lược như sau:
1.1 Về cấu trúc dữ liệu:
- Dữ liệu đầu vào được nhập từ bàn phím
- Dữ liệu đầu ra được ghi là File
1.2 Về ngôn ngữ lập trình:
- Sau khi tìm hiểu và so sánh một số ngôn ngữ lập trình gồm: Pascal, C, C++
… em quyết định chọn ngôn ngữ lập trình C để cài đặt chương trình Demo với các lý
do sau:
+ C là ngôn ngữ lập trình khá linh động và phổ biến
+ C hỗ trợ các thư viện đáp ứng được các hàm dùng để xử lýthích hợp với đề tài của em
+ Chọn cấu trúc danh sách để cài đặt
+ Ngoài ra, C là ngôn ngữ thông dụng và được nhiều người sửdụng đến
Trang 9CHƯƠNG II: ỨNG DỤNG
I CƠ SỞ LÝ THUYẾT:
Lý thuyết đồ thị là lĩnh vực đã được nghiên cứu từ những năm đầu thế kỷ 18bởi nhà toán học Leonhard Euler người Thụy Sĩ Đồ thị được sử dụng đề giải quyếtnhiều bài toán thuộc các lĩnh vực khác nhau, trong tin học là một trường hợp cụ thể
Có thể nói, lý thuyết đồ thị được ứng dụng rộng rãi trong tất cả lĩnh vực khác nhau
II CÁC KHÁI NIỆM VÀ CHƯƠNG TRÌNH CON:
1> Đồ thị: Là một cấu trúc dữ liệu rời rạc bao gồm các đỉnh và các cung nối
các cặp đỉnh này
Hay đồ thị là cặp G=(V,E), trong đó V là đỉnh và E= { (x,y) | x,y E } làtập cạnh Đồ thị là tập hợp các đối tượng được biểu diễn bằng các đỉnh và giữa cácđồi tượng có một quan hệ biểu diễn bằng các cung
Cũng có thể biểu diễn đồ thị bằng hình học: Trên mặt phẳng biểu diễn bằngcác điểm, biểu diễn các cung bằng một đoạn có chỉ rõ hướng của cung
* Đồ thị gồm có: đồ thị vô hướng và đồ thị có hướng.
- Đồ thị có hướng được ký hiệu G=[X,U] được xác định bởi:
+ X được gọi là đỉnh của đồ thị Nếu đồ thị có n đỉnh, tức [X] = n, thì đựoc
nói bậc đồ thị của n Khi số phần tử của X là hữu hạn thị được gọi là đồ thị hữu hạn
+ U gọi là cặp đỉnh có thứ tự u=(i,j), gọi là cung nối đỉnh i với j của đồ thị.
Đỉnh i được gọi là gốc, đỉnh j được gọi là nhọn, là hai đầu mút của cung u
Bằng hình vẽ, các đỉnh của đồ thị có hướng được trình bày bằng các điểm, cáccung được trình bày bằng mũi tên nối từ đỉnh gốc tới đỉnh nhọn
- Đồ thị vô hướng được ký hiệuG=[X,U] được xác định bởi:
Trang 10+ X được gọi là đỉnh của đồ thị.
+ U gọi là cặp đỉnh không tính đến thứ tự u=(i,j), gọi là cạnh nối giữa đỉnh
A = { aij : aij = 1 nếu (i.j) Ej , aij = 0 nếu (i,j) E; I,j =1,2,…, n}
Trang 11+ Ma trận kề của đồ thị vô hướng là đồ thị đối xứng A[i,j] = A[j,i]; i,j = 1,2,…
n Ngược lại, mỗi (0,1) ma trận cấp n đẳng cấu với một đơn đồ thị vô hướng n đỉnh
+ Tổng các phần tử theo dòng i (cột j) của ma trận kề chính bằng bậc đỉnh I(đỉnh j)
+ Nếu ký hiệu ,i,j = 1,2,…,n là các phần tử của ma trận Khi đó:
Trang 12for(int j=i+1;j<=n;j++)
{ printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
} }
Void in(){
- Để xác định số thành phần liên thông của đồ thị, ta sử dụng biến solt để
ghi nhận các đỉnh cùng mmột thành phần liên thông trong mảng chuaxet[] như sau:
+ Nếu đỉnh i chưa được duyệt, chuaxet[i] có giá trị 0;
+ Nếu đỉnh i được duyệt thuộc thành phần thứ j=solt, ta ghi nhận
unsigned i,j,solt,chuaxet[max];
if (solt == 1)
for (int i=1; i<=solt; i++) {
Trang 13printf("\n Thanh phan lien thong thu %d la :", i);
scanf("%d",&i);
if (chuaxet[j] == 1) printf("\n");
}
}
void LienThong()// Kiem tra tinh lien thong cua do thi{
}
Ví dụ 3: Đồ thị có 3 bộ phận liên thông.
4> Duyệt chiều sâu (DFS):
Giả sử ta có đồ thị G=(V,E) với các đỉnh ban đầu được đánh dấu la chưa duyệt
Từ 1 đỉnh v nào đó ta bắt đầu duyệt như sau: Đánh dấu v đã duyệt, với mỗi đỉnh wchưa duyệt kề với v, ta thực hiện quá trình trên cho w
Trang 14Để kiểm tra duyệt mỗi đỉnh, ta sử dụng một mảng chuaxet[] gồm n phầntử(tương ứng với n đỉnh), nếu đỉnh thứ i đã được duyệt , phần tử tương ứng trong
mảng chuaxet[] co giá trị 0 Ngược lại, nếu đỉnh thứ i chưa được duyệt , phần tử tương ứng trong mảng chuaxet[] có giá trị 1.
* Giải thuật:
void DFS(int v){
Thủ tục DFS() sẽ thăm tất cả các đỉnh cùng thành phần liên thông với v mỗi
đỉnh đúng một lần Chúng ta cần thực hiện duyệt như sau:
{ for( i=1;i<=n;i++)
chuaxet[i]=1; /* thiết lập giá trị ban đầu cho mảng chuaxet[]*/
Trang 15Kết quả duyệt: ABFDCEG.
* Trong trường hợp viết văn bản chương trình cho DFS() thì ta sử dụng
giải thuật sau:
Void Init(int G[][max], int *n) /* để đọc dữ liệu từ tệp DFS.IN {
FILE *fp; int i,j;
Fp = fopen(“DFS.IN”, “r”);
If(fp == NULL) {
Printf(“ khong co file input”);
Return;
}fscanf(fp,”%d”,n);
for(i=1;i<=*n;i++) {
for(j=1;j<=*n;j++) fscanf(fp,”%d”,&G[i][j]);
printf(“%3d”,G[i][j]);
} } }
//* void DFS(int G[][max], int n, int v, int chuaxet[]{
int u;
printf(“%3d”,v); chuaxet[v] = 0;
for(u=1;u<=n;u++) {
if (G[v][u]==1 && chuaxet[u])
Trang 16}}
- int fclose(FILE *f): f là con trỏ tập tin được mở bởi hàm fopen();fclose được dùng để đóng tập tin được mở bởi hàm fopen() Nếu đóng được tập tin thìkết quả trả về là số 0, nếu không thì có lỗi xảy ra
- fprintf(FILE *f, const char *format, varexpr)Trong đó: format là chuỗi định dạng; varexpr danh sách các biểu thức, mỗibiểu thức cách nhau dấu phẩy(,) Dùng để ghi dữ liệu có định dạng lên tập tin văn bản
- fscanf(FILE *f, const char *format, varlist)Trong đó: format là chuỗi định dạng; varlist danh sách các biến, mỗi biến cáchnhau dấu phẩy(,).Dùng để đọc dữ liệu từ tập tin văn bản
- memset(char *Des, int c, size_t n): Dùng để đặt n kí tự đầu tiên chochuỗi là kí tự c
b> Về đồ hoạ:
- initgraph( int *graphdrive, int *graphmode, char * Path)
Trang 17Trong đó: graphdriver chứa trình điều khiển đồ họa; graphmode kiểu đồ họa;Path đường dẫn đến thư mục chứa các drive đồ hoạ.
- circle(int x, int y, int r): Hàm vẽ đường tròn trên màn hình đồ họa cótâm tại toạ độ(x,y) và có bán kính r
- setlinestyle( int style, int pattern, int thickness): Để thiết lập dạng, mẩu
và bề dày của đường thẳng
- outtextxy(int x, int y, char far * textstring): Hiển thị nội dung xâutextstring tại toạ độ (x,y) trong màn hình đồ họa
- setbkcolor(Mau): Thiết lập màu nền cho màn hình đồ họa
- setcolor(Mau):Thiết lập màu nét
III MÔ HÌNH, LƯU ĐỒ, CHƯƠNG TRÌNH CON VÀ KẾT QUẢ ĐẠT ĐƯỢC:
1.Mô hình của chương trình chính:
2 Lưu đồ của một số chương trình:
a> Creat_matrix:
BEGI N
NHẬP DỮ LIỆUMENU XỬ LÝ
END
Nhập ma trận, in ma trận, thành phần liên thông, DFS, …
Trang 18b> in_matrix:
BEGI N
i = 1
j ++
fClose(tp2)
S
Trang 19c> DFS:
Đ
j ++
BEGI N
Nhập số phần tử
n
i <= n
END Đ
File *fp1 = fopen(“MTKe.in”,”r”)
n
i = 1Chuaxet[u] = 0
Trang 20i <= n
EN D Đ
Trang 21f> Kết quả liên thông:
Đ
Đ
BEGI N
i <=
solt
EN D Đ
Trang 22e> liên thông:
EN D Đ
solt = 1
i <= n SMeset (chuaxet, osizeof (chuaxet))
Trang 23EndDFSLien thong
Trang 24Trước khi đưa chương trình con và kết quả vào thì em xin giới thiệu vềphần giao diện đồ hoạ được trình gồm 3 phần chính đó là: giới thiệu, chạy Demo vàthoát Và sau đây là phần giao diện của nó:
Khi đưa giao diện xong rồi thì ta sẽ giới qua phần giới thiệu tổng quan của bài Duyệt
dồ thị theo chiều sâu như sau:
Trang 25Bắt đầu, khi ta giới thiệu xong phần đó rồi thì bước tiếp theo là cho chạy vào phầnDemo để thực hiện các bước trình bày sau đây theo yêu cầu của đề:
Màn hình của yêu cầu xuất hiện, lúc đó ta có thể chọn một trong ba bất kì để xemđược kết quả của bài làm mình rõ hơn Sau đây, ta thực hiện theo từng mục của nó.Trước khi thực hiện kết quả hiện thị trên màn hình thì ta có giải thuật thực như sau:
void creat_matrix() {
printf("\n Nhap so dinh cua do thi n="); scanf("%d",&n);
} fprintf(fp1,"\n");
fclose(fp1);}
void in_matrix() {
FILE *fp2=fopen("E:\\MTKe.txt","r+");
Trang 26if(fp2==NULL)
{ printf("\n Ma tran ke vua nhap:");
fclose(fp2);
}
* Kết quả đạt được:
Nhập dữ liệu đầu vào khi hiển thị ma trận
Mới nhập xong ma trận Nhìn vào hình trên thì thấy nó yêu cầu nhiều nhưng em chỉthực hiện phần nhập ma trận cho file văn bản Còn mấy ý khác thì tương tự như vậy
Bây giờ, ta đã thực hiện xong ý thứ nhất bây giờ thực hiện tiếp ý thứ hai tiếpnội dung vừa nãy đó là: vẽ đồ thị bằng đồ hoạ Trong phần vẽ đồ thị em có dử dụng
Trang 27hàm thư viện con chuột để vẽ nó Khi vào vẽ đồ thị thì ta sẽ có phần hướng dẫn vẽ đồthị như sau:
* Giải thuật như sau:
void ve_do_thi(chitietdinh dinh[max], int sodinh, chitietcanh[max], int socanh)
}ve_dinh(dinh,sodinh);
}
* Kết quả đạt được:
Trang 28Và thêm cái hình ví dụ về đồ thị có 6 đỉnh như sau:
Đáng lẽ vẫn còn một ý nữa nhưng em chưa thực hiện được nên chương trình của emtới đây đã xong, Và sau đây ta sẽ kết thúc chương trình nên chọn nút thoát, Trước khithoát thì ta thấy sẽ găp màn hình này rồi sẽ kết thúc
Trang 29CHƯƠNG 3: KẾT LUẬN VÀ ĐÁNH GIÁ
- Qua đề tài niên luận này giúp em hiểu ra được một số vấn đề cần thiết trongkhi lập trình và sửa được bài làm của mình để có thể hoàn chỉnh hơn
II HẠN CHẾ:
Do đây là lần đầu tiên em làm niên luận này Với kiến thức còn hạn hẹp nênchương trình vẫn còn nhiều thiếu sót, chưa đáp ứng đầy đủ các yêu cầu của đề ra Vàchưa làm hoàn thành đúng những nội dung đó, vẫn còn thiếu một ý nữa mới hoàn tấtxong được Chưa đi sâu và vấn đề và giao diện chưa đẹp mắt lắm
III HƯỚNG PHÁT TRIỂN:
Hoàn chỉnh tốt chương trình mình thực hiện, cố gắng khắc phục những lỗi sai
và cải thiện chương trình một cách nhanh chóng Để có thể hoàn thành một chươngtrình đúng như yêu cầu của nội dung Đồng thời, biết cách tạo ra những ý của riêngmình để chương trình chạy được hoàn thiện hơn Vì vậy, hướng phát triển tiếp theo làhoàn thành chương trình ngày càng hoàn thiện đầy đủ chức năng hơn
Trang 30TÀI LIỆU THAM KHẢO
********
[1] Giáo trình cấu trúc dữ liệu của Trường đại học Cần Thơ
[2] Giáo trình ngôn ngữ C: Th.Sĩ Tiêu Kim Cương, Nhà Xuất Bản Giáo Dục
[3] Lý Thuyết Đồ Thị: Nguyễn Hữu Ngự, Nhà Xuất Bản Đai Học Quốc Qia Hà Nội.[4] Tài liệu tham khảo trên mạng
[5] Wirth,Chương trình = Cấu trúc dữ liệu + Giải thuật