Professional Documents
Culture Documents
(123doc) - Nien-Luan-Duyet-Do-Thi-Theo-Chieu-Sau-Dfs
(123doc) - Nien-Luan-Duyet-Do-Thi-Theo-Chieu-Sau-Dfs
NIÊN LUẬN 1:
HỌC KỲ 2, 20…. –
20...
LỜI NÓI ĐẦU
Để 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ết
hợ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ên
quan đế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ốt
thờ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.
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
................................................................................................................................................
MỤ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
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ông
nghệ 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ậ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.
Đề tài này nói về mô hình hoá của đồ thị như: đọc File, vẽ đồ thị, in nội dung
nú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.
1. Về lý thuyết:
- Cần hiểu và nắm rõ các giải thuật duyệt đồ thị theo chiều sâu
trong cấu trúc dữ liệu và giải thuật.
- Nắm vững ngôn ngữ lập trình C nhằm giải quyết một cách hiệu
quả các vấn đề được đặt ra.
- Chương trình Demo phải dễ hiểu và dễ coi, đề tránh cho người
kham khảo không muốn xem.
- Cho phép nhập vào File, vẽ đồ thị bằng đồ hoạ, in nội dung nút
theo giải thuật DFS.
- Trong phần vẽ đồ thị em có sử dụng hàm thư viện con chuột để
vẽ.
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ỷ 18
bởi nhà toán học Leonhard Euler người Thụy Sĩ. Đồ thị được sử dụng đề giải quyết
nhiề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.
1 2 3 4 5 6
1 0 1 1 0 0 0
2 1 0 1 1 0 0
3 1 1 0 0 1 0
4 0 1 0 0 1 1
5 0 0 1 1 0 1
6 0 0 1 1 0 1
- Tính chất:
+ 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 đó:
Ap = A.A… A (p lần); aijp , i, j = 1,2,…,n,
Ma trận kề của đồ thị có hướng cũng được định nghĩa tương tự, chỉ cần lưu ý tới
hướng của cạnh. Ma trận kề của đồ thị có hướng không đối xứng.
Ví dụ 1: Ma trận Kề của đồ thị có hướng.
1 2 3 4 5
1 0 1 1 0 0
20 0 0 1 1
3 0 0 0 1 0
4 0 0 0 0 0
51 0 0 0 0
1 2 3 4 5 6
1 0 3 7 0 0 0
2 3 0 6 6 0 0
3 7 6 0 0 3 0
4 0 6 0 0 8 5
5 0 0 3 8 0 9
6 0 0 0 5 9 0
for(int j=i+1;j<=n;j++)
{ printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
}
}
Void in()
{
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
printf("%3d",G[i][j]);
}
printf("\n");
}
Để kiểm tra duyệt mỗi đỉnh, ta sử dụng một mảng chuaxet[] gồm n phần
tử(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)
{
chuaxet[v]=0;
for(i=1;i<=n;i++)
if ((A[u][i]) && (chuaxet[i]))
DFS(u);
}
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[]*/
DFS(u);
for(i=1;i<=n;i++)
if (chuaxet[i])
DFS(i);
}
Ví dụ 4:
DFS(G,n,u,chuaxet);
}
}
//* void main(void){
For(i=1;i<=n;i++)
Chuaxet[i] = 1;
For(i=1;i<=n;i++)
if (chuaxet[i])
DFS(G,n,I,chuaxet);
getch();
}
5> Ngoài ra còn sử dụng các hàm được định nghĩa sẵn trong C và trong đồ
họa:
a> Về C:
- FILE *fopen(const char *Path, const char * Mode)
Trong đó Path là tệp tin cần mở để ghi hoặc đọc; Mode là chuỗi cách thức mà
tập tin sẽ mở.
- 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ỗi
biể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ách
nhau 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 cho
chuỗi là kí tự c.
b> Về đồ hoạ:
- initgraph( int *graphdrive, int *graphmode, char * Path)
Trong đó: 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âu
textstring 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:
BEGI
BEGI N
N
Nhập số phần tử
Nhập ma trận, in ma
n
NHẬP DỮ trận, thành phần liên
LIỆU thông, DFS, …
File *fp1=
fopen(“MTKe.txt”,”w”)
MENU XỬ LÝn
i=1
END
S
i <= n
Đ
2. Lưu đồ của một số chương trình:
Fclose(fp1)
a> Creat_matrix: j=i+1
j ++
S END
G[i][j] = 0 j <= n
Đ
G[i][j]
SVTH: Diệp …………….. Trang 12
G[i][j] = G[j][i] j ++
Đề tài: Duyệt Đồ Thị Theo Chiều Sâu (DFS) GVHD: Triệu ……
BEGI
N
tp2 = =
null
Đ
i=1
b> in_matrix:
S fClose(tp2)
i <= d END
Đ
j ++
j=1
j ++
BEGI
N
Nhập số phần tử
n
Chuaxet[u] = 0
i=1
S Fclose(fp2)
i <= n
Đ
END
j=1
c> DFS:
S
j <= n
j ++ Đ
G[i][j]
S
A[u][i] &&
chuaxet[i]
SVTH: Diệp …………….. Đ Trang 14
DFS1 (i) j ++
Đề tài: Duyệt Đồ Thị Theo Chiều Sâu (DFS) GVHD: Triệu ……
BEGI
N
i=1
S DFS (u)
i <= n
d> Duyệt DFS:
Đ
i=1
i ++ Chuaxet (i) = 1
j <= n EN
D
Đ
SVTH: Diệp …………….. Trang 15
Đ
DFS (i) i ++ chuaxet[i
Đề tài: Duyệt Đồ Thị Theo Chiều Sâu (DFS) GVHD: Triệu ……
BEGI
N
S Đ
n solt = 1 Đồ thị liên thông
i=1
S
i <= EN
solt D
Đ
i
j=0
DFS (i)
SVTH: Diệp …………….. Trang 16
i ++
Đề tài: Duyệt Đồ Thị Theo Chiều Sâu (DFS) GVHD: Triệu ……
BEGI
N
solt = 1
i=0
S
i <= n
i ++
Đ Ketqualienthong
S
chuaxet[i] ==
0
Đ EN
D
solt ++
SVTH: Diệp …………….. Trang 17
Begin
f> chương trình chính:
Nhap dinh n
Nhap ma tran
In ma tran
DFS
Lien thong
Trướ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:
Bắ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ần
Demo để 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);
FILE *fp1=fopen("E:\\MTke.txt","w+");
fprintf(fp1,"%d\n",n);
printf(" Nhap nua ma tran ke:");
for(int i=1;i<=n;i++)
{ for(int j=i+1;j<=n;j++)
{ printf("G[%d][%d]=",i,j);
scanf("%d",&G[i][j]);
G[j][i]=G[i][j];
}
G[i][i]=0;
}
fprintf(fp1,"\n");
fclose(fp1);}
void in_matrix()
{
FILE *fp2=fopen("E:\\MTKe.txt","r+");
if(fp2==NULL)
{
printf("\n Ma tran ke vua nhap:");
fscanf(fp2,"%3d",&n);
printf("%d\n",n);
}
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{ fscanf(fp2,"%d",&G[i][j]);
printf("%3d",G[i][j]);
}
printf("\n"); }
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ếp
nội dung vừa nãy đó là: vẽ đồ thị bằng đồ hoạ. Trong phần vẽ đồ thị em có dử dụng
hà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:
Đá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 em
tớ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 khi
thoát thì ta thấy sẽ găp màn hình này rồi sẽ kết thúc.
********
[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