You are on page 1of 47

Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.

net

NỘI DUNG:

I- Đồ thị và các khái niệm liên quan

1- Các khái niệm

- Đồ thị (Graph): Là một cấu trúc rời rạc gồm hai thành phần G=(V,E).
Trong đó:

• V-Vertex: là tập hữu hạn các đỉnh, V≠ø

• E-Edge: Là tập hữu hạn các cạnh

- Cạnh có hướng (cung):Là cạnh có quy định chiều

- Cạnh vô hướng: Là cạnh không quy định chiều

- Đồ thị G=(V,E) được gọi là đơn đồ thị nếu giữa hai đỉnh bất kỳ được nối
với nhau bởi không quá một cung.

- Đồ thị G=(V,E) được gọi là đa đồ thị nếu giữa hai đỉnh bất kỳ được nối với
nhau bởi hai cung trở lên.

- Đồ thị gọi là có hướng nếu các cung được xác định là có hướng

- Đồ thị được gọi là có hướng nếu các cung không xác định hướng.

→ Một đồ thị vô hướng luôn được coi là đồ thị có hướng bằng cách thay
một cung bất kỳ bằng hai cung ngược chiều nhau.

- Giả đồ thị (Pseudo Graph): Nếu tồn tại một cạnh nối một đỉnh với chính nó
gọi là “khuyên”.

- Hai cạnh của một đồ thị được coi là kề nhau nếu chúng có chung một đỉnh.
Hai đỉnh được coi là kề nhau nếu chúng được nối với nhau bởi một cạnh.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

→ Một cạnh và đỉnh nằm trên cạnh đó được coi là liên thuộc với nhau.

- Đồ thị có trọng số, mỗi cạnh được gắn với một giá trị nào đó, được gọi là
trọng số, độ dài, chi phí, hoặc các tên khác tùy theo ứng dụng

2- Biểu diễn đồ thị

Để lưu trữ đồ thị và thực hiện các thuật toán khác nhau với đồ thị trên máy
tính thì cần phải tìm những cấu trúc dữ liệu thích hợp để mô tả đồ thị.

Có 4 cách biểu diễn ma trận:

- Biểu diễn bằng ma trận kề.

- Biểu diễn đồ thị bằng ma trận liên thuộc.

- Biểu diễn ma trận bằng danh sách cạnh.

- Biểu diễn đồ thị bằng danh sách kề

2.1- Biểu diễn bằng ma trận kề

Cho đồ thị G=(V,E) với V gồm n đỉnh (n>=1). Để biểu diễn G người ta dùng
một ma trận vuông A[n×n] các phần tử là 0 và 1 được xác định như sau:

Aij= 1 (vi, vj) thuộc E

0 (vi, vj) không thuộc E

Ví dụ:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Ma trận kề được biểu diễn như sau:

v1 v2 v3 v4

v1 0 1 1 1

v2 1 0 1 0

v3 1 1 0 0

v4 1 0 0 0

Trường hợp là đa đồ thị có khuyên:

Aij = 1 Nếu có cạnh nối vi với vj

0 Nếu vi có khuyên

Ví dụ:

v1 v2 v3 v4 v5

v1 0 3 0 1 0

v2 3 0 1 1 1

A= v3 0 1 1 1 0

v4 1 1 1 0 0

v5 0 1 0 0 1

Chú ý:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

• Ma trận kề của một đồ thị tùy thuộc vào thứ tự liệt kê các đỉnh. Do vậy có n!
Ma trận liền kề khác nhau của một đồ thị n đỉnh

• Với đồ thị vô hướng thì các phần tử đối xứng qua đường chéo chính.

• Ma trận kề của đồ thị có hướng không phải là ma trận đối xứng.

• Tổng tất cả các giá trị trên hàng i chính là số bậc ra của đỉnh đó, tổng tất cả
trên cột j chính là số bậc vào của đỉnh đó.

• Trong thực tế mỗi một cung sẽ luôn xác định một giá trị nào đó, giá trị đó có
thể là độ dài, có thể là tiền đi lại, chi phí,...giá trị này còn gọi là trọng số Cij
được hiểu như sau:

0 nếu vi trùng vj

• Cij= trọng số thực nếu (vi,vj) Є E

∞ nếu (vi,vj) không thuộc E

Ví dụ:

Ma trận trọng số của đồ thị được biểu diễn như sau:

0 1 3 ∞ ∞

1 0 7 ∞ ∞

Cij= 3 7 0 5 8

∞ ∞ 5 0 4

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

∞ ∞ 8 4 0

 Ưu và nhược điểm của phương pháp mô tả bằng ma trận kề, ma trận


trọng số.

• Ưu điểm: Biết được hai đỉnh u và v có kề nhau không, biết được trọng số của
hai đỉnh u và v bất kỳ.

• Nhược điểm: Tốn bộ nhớ. Với đồ thị n đỉnh thì cần n×n ô nhớ, nếu số cạnh
của đồ thị ít thì phương pháp này quá lãng phí bộ nhớ.

2.2 Biểu diễn đồ thị bằng ma trận liên thuộc

Cho đồ thị vô hướng G=(V,E), với tập đỉnh V={1,2,...,n} và tập cạnh
E={e1,e2,...,en}. Để biểu diễn G người ta dùng ma trận liên thuộc M[n×m]. Trong
đó:

Mij= 1 nếu cạnh ei nối với đỉnh vi

0 nếu cạnh ei không nối với đỉnh vi

Ví dụ:

Ma trận liên thuộc của đồ thị được biểu diễn như sau:

e1 e2 e3 e4 e5 e6 e7

1 1 1 1 0 0 0 1

2 0 0 0 1 1 0 1

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

3 1 0 0 0 0 0 0

4 0 1 0 1 0 1 0

5 0 0 1 0 1 1 0

2.3 Biểu diễn đồ thị bằng danh sách kề

Trong trường hợp đồ thị thưa (m<68×n), người ta thường dùng cách biểu diễn
đồ thị theo danh sách cạnh.

Trong cách biểu diễn này chúng ta lưu trữ danh sách tất cả các cạnh. Mỗi cạnh
e=(x,y) của đồ thị sẽ tương ứng với 2 biến dau[e] và cuoi[e].

Ví dụ:

Đầu Cuối

v1 v2

v1 v4

v2 v4

v3 v1

v3 v2

v4 v3

2.4 Biểu diễn đồ thị bằng danh sách kề

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Trong rất nhiều vấn đề ứng dung của lý thuyết đồ thị, cách biểu diễn đồ thị dưới
dạng danh sách kề là cách biểu diễn thích hợp nhất.

Với mỗi đỉnh v của đồ thị chúng ta lưu giữ các đỉnh kề với nó, mà chúng ta kí
hiệu là ke(v).

Ví dụ:

Biểu diễn đồ thị trên bằng danh sách kề như sau:

Như vậy mỗi đỉnh của đồ thị có một danh sách các đỉnh kề với nó. cấu trúc được
mô phỏng như sau:

type

pointer=^Member

member=record

number:1..n; {Số hiệu đỉnh kề}

next:pointer;

end;

graph=aray[1..n] of pointer;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

var G:graph;

3- Bậc, đường đi, chu trình và tính liên thông

3.1- Bậc của đỉnh

- Hai đỉnh u và v của đồ thị G được gọi là kề nhau nếu (u,v) là một cạnh của đồ
thị G. và đặt e=(u,v) thì e là cạnh liên thuộc với hai đỉnh u và v.

- Nếu một cạnh e=(u,v) là một cung của đồ thị có hướng thì ta nói v là đỉnh kề
của đỉnh u, u được gọi là đỉnh đầu, v là đỉnh cuối.

- Bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với đỉnh đó và kí
hiệu là deg(v).

Ví dụ:

Ta có deg(a)=3, deg(b)=2, deg(c)=2, deg(d)=5, deg(e)=2,

deg(f)=3, deg(g)=a, deg(h)=0.

Chú ý:

• Nếu đỉnh có khuyên thì mỗi đỉnh được cộng thêm 2 đơn vị vào bậc của đỉnh
đó.

• Nếu đỉnh có bậc bằng 1 thì gọi là đỉnh treo.

• Đỉnh có bậc bằng 0 thì gọi là đỉnh cô lập.

• Nếu đồ thị có mọi đỉnh đều cô lập thì gọi là đồ thị rỗng.

• Ta gọi bán bậc ra (bán bậc vào ) của đỉnh v trong đồ thị có hướng là số cung
của đồ thị đi ra khỏi nó (đi vào nó) và kí hiệu là deg+(v) (deg-(v)).

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

• Tổng tất cả các bán bậc ra (bán bậc vào) của một đỉnh gọi là bậc của đỉnh đó.

• Nếu deg+(v)+deg-(v)=0 thì đỉnh v là đỉnh cô lập.

• Nếu deg+(v)=1 và deg-(v)=0 hoặc deg+(v)=0 và deg-(v)=1 thì v được gọi là


đỉnh treo. Nếu đỉnh có khuyên thì được tính là một đơn vị cho bán bậc ra và
một đơn vị cho bán bậc vào.

Ví dụ:

Ta có: deg+(a)=3; deg-(a)=0;

deg+(b)=2; deg-(b)=2;

deg+(c)=2; deg-(c)=1;

deg+(d)=1; deg-(d)=3;

deg+(e)=1; deg-(e)=2;

deg+(f)=1; deg-(f)=2.

3.2 Đường đi và chu trình

- Cho đồ thị G= (V,E), đường đi từ s tới t có độ dài bằng n là một dãy liên tiếp
các đỉnh vo,v1,v2...,vn mà xuất phát là s=so,kết thúc là vn, các cạnh ei=(vi-
1,vi), i=1,..,n, là đôi một khác nhau.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

- Độ dài của đường đi là số cạnh tham gia trong đường đi đó (đối với đồ thị
không có trọng số).

- Nếu đồ thị có trọng số thì độ dài của đường đi sẽ là tổng độ dài của các cạnh
thuộc đường đi đó.

- Một đường đi được gọi là đường đi đơn nếu như trong đường đi đó các đỉnh
chỉ xuất hiện một lần trừ đỉnh đầu và đỉnh cuối.

- Chu trình là một đường đi khép kín mà đỉnh đầu và đỉnh cuối trùng nhau.

3.3 Sự liên thông

- Một đồ thị vô hướng G=(V,E) được gọi là liên thông nếu tồn tại đường đi
giữa mọi cặp đỉnh của nó.

- Nếu một đồ thị không liên thông thì một đồ thị con liên thông cực đại của nó
được gọi là một thành phần liên thông.

Ví dụ:

G1:Liên thông G2:Không liên thông

- Một đồ thị là liên thông nếu nó chỉ có một thành phần liên thông.

- Đồ thị có hai thành phần liên thông trở lên gọi là rừng.

- Một đỉnh trong đồ thị G mà khi xóa nó đi và tất cả các cạnh liên thuộc với nó
ta nhận được một đồ thị con mới có nhiều thành phần liên thông hơn đồ thị G
được gọi là đỉnh cắt hay điểm khớp. Việc xóa đỉnh cắt khỏi đồ thị liên thông
sẽ tạo ra một đồ thị con không liên thông. Hoàn toàn tương tự, một cạnh mà
khi ta bỏ nó đi sẽ tạo ra một đồ thị có nhiều thành phần liên thông hơn so với
đồ thị xuất phát được gọi là cạnh cắt hay cầu.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Ví dụ:

- Trong đồ thị trên, các đỉnh cắt là v, w, s và các cầu là (x,v), (w,s).

- Đồ thịG có hướng được gọi là liên thông mạnh nếu mọi cặp đỉnh (u,v) của nó
đều tồn tại một đường đi từ u tới v và một đường đi từ v tới u.

- Đồ thị G có hướng không liên thông mạnh thì một đồ thị con liên thông
mạnh cực đại của G được gọi là một thành phần liên thông mạnh cực đại.

- Đồ thị có hướng G được gọi là liên thông yếu nếu đồ thi vô hướng nề của nó
là liên thông.

- Đồ thị có hướng G được gọi là liên thông một chiều nếu với hai đỉnh phân
biệt bất kỳ u và v của G đều có đường đi từ u tới v hoặc đường đi từ v tới u.

Ví dụ:

G G’

Đồ thị G là liên thông mạnh nhưng đồ thị G’ là liên thông yếu (không có đường
đi từ u tới x, cũng như từ x tới u)

Định lý: Nếu G là một đơn đồ thị vô hướng n đỉnh, m cạnh, k thành phần liên
thông. Ta có mối quan hệ:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Chứng minh:

Bất đẳng thức n-k ≤m được chứng minh bằng quy nạp theo m. Nếu n=0 thì k=n
nên bất đẳng thức đúng. Giả sử bất đẳng thức đúng đến m-1, với m ≥1. gọi G’ là đồ
thị con bao trùm của G có số cạnh m0 là nhỏ nhất sao cho nó k thành phần liên
thông. Do đó việc loại bỏ bất cứ cạnh nào trong G’cũng tăng số thành phần liên
thông lên 1 và khi đó đồ thị thu được cũng có n đỉnh, k+1 thành phần liên thông và
m0-1 cạnh. Theo giả thiết quy nạp, ta có m0-1 ≥ n-(k+1) hay m0 ≥n-k. Vậy m≥ n-k.

Bổ sung cạnh vào G để nhận được đồ thị G’’ có m1 cạnh sao cho k thành phần
liên thông là một đồ thị đầy đủ. Ta có m ≤m1 nên chỉ cần chứng minh:

Giả sử Gi và Gj là hai thành phần liên thông của G’’ với ni và nj đỉnh và ni ≥
nj>1 (*). Nếu ta thay Gi và Gj bằng đồ thị đầy đủ với ni+1 và nj-1 đỉnh thì tổng số đỉnh
không thay đổi nhưng số cạnh tăng thêm một lượng là:

[ - ]-[ - ]=ni-nj+1

Thủ tục này được lặp lại khi hai thanh phần nào đó có số đỉnh thỏa (*). Vì vậy
m1 là lớn nhất (n,k là cố định) khi đồ thị gồm k-1 đỉnh cô lập và một đồ thị đầy đủ
với n-k+1 đỉnh. Từ đó suy ra bất đẳng thức cần tìm.

Chú ý:

- Nếu G liên thông thì ta có k=1. khi đó ta có:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

- Nếu G là một đơn đồ thị vô hướng liên thông thì số thành phần liên thông
của nó là 1.

3.4 Các định lý cơ bản về đồ thị

Định lý 1: (Định lý bắt tay) Cho G là một đồ thị vô hướng có m cạnh. Khi đó
tổng số bậc của tất cả các đỉnh bằng hai lần số cạnh.

∑deg(v)=2×m (vЄV).

Định lý 2: trong một đồ thị vô hướng thì số đỉnh bậc lẻ luôn là số chẵn.

Chứng minh: Gọi v1 là tập đỉnh bậc chẵn, v2 là tập đỉnh bậc lẻ.

Theo định lý 1: 2×m= ∑deg(v)= ∑deg(v1)+ ∑deg(v2).

→ Số đỉnh bậc lẻ của đồ thị phải là một số chẵn.

4- Các phương pháp duyệt đồ thị

Việc giải quyết các vấn đề duyệt đồ thị đòi hỏi ta phải xem xét tất cả các đỉnh và
các cung của đồ thị theo một hệ thống nào đó. Vì vậy các kỹ thuật duyệt đồ thị để
thăm tất cả các đỉnh và các cung của đồ thị đóng vai trò quan trọng trong việc thiết
kế các thuật toán trên đồ thị.

Bài toán tổng quát:

Cho một đồ thị G=(V,E) vô hướng. Hãy thăm tất cả các đỉnh của đồ thị, mỗi đỉnh
đúng một lần. Để thăm tất cả các đỉnh của đồ thị người ta tiến hành theo hai thuật
toán:

- Duyệt đồ thị theo chiều rộng (BFS- Breadth First Search).

- Duyệt đồ thị theo chiều sâu (DFS- Depth First Search).

→ Sau đây chúng ta cùng tìm hiểu hai thuật toán duyệt đồ thị trên.

4.1 Duyệt đồ thị theo chiều rộng (BFS- Breadth First Search)

a) Nguyên tắc:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

- Chọn một đỉnh v0 của đồ thị làm điểm xuất phát.

- Thăm đỉnh v0 rồi lần lượt thăm tất cả các đỉnh lân cận của v 0 mà chưa được
thăm.

- Sau đó đỉnh v nào được thăm trước thì các đỉnh lân cận của nó sẽ được thăm
trước và quá trình sẽ lại được tiếp tục.

- Nếu còn đỉnh nào chưa được thăm thì chọn ra một đỉnh để thăm và quá trình
diễn ra như đối với v0.

- Mỗi đỉnh chỉ được thăm một lần và kết thúc khi tất cả các đỉnh đều được
thăm.

b) Thuật toán: Trong một thuật toán ta có sử dụng:

- Một danh sách Q như một hàng đợi (Lấy một phần tử ra ở đầu Q và chèn
một phần tử mới vào cuối Q)

- Sử dụng hàm visited(v) để thực hiện việc thăm đỉnh v.

• Nếu visited(v)=1 thì đỉnh v đã được thăm

• Nếu visited(v)=0 thì đỉnh v chưa được thăm

- Một thủ tục BFS(v0): Duyệt đồ thị theo chiều rộng xuất phát từ đỉnh v0

Procedure BFS(v0)

Begin

1. Visited(v0):=1; {thăm đỉnh v0}

2. Khởi tạo danh sách Q với v0 được nạp vào; {Q←v0}

3. While Q<>ø do

Begin

+ Loại đỉnh u ở đầu Q ra ngoài

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

+ for <Tất cả các đỉnh w lân cận của u> do

if visited(w)=0 then

begin

+Đặt w vào cuối danh sách Q

+ Visited(w):=1;

end;

End;

End;

- Dựa vào thủ tục BFS(v0) thì thuật toán duyệt đồ thị theo chiều rộng như sau:

Begin

1. For u:=1 to n do visited(u):=0;{khởi tạo trạng thái ban đầu của đồ thị
là mọi đỉnh đều chưa được thăm}

2. For u:=1 to n do

if visited(u):=0 then BFS(u);

End;

Ví dụ:

→ Với đồ thị như hình vẽ thì thứ tự duyệt đồ thị theo chiều rộng:

• Xuất phát từ đỉnh A: A B C D F E G H

• Xuất phát từ đỉnh D: D B C F A E G H

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

4.2 Duyệt đồ thị theo chiều sâu (DFS- Depth First Search)

a) Nguyên tắc

- Chọn một đỉnh v0 của đồ thị làm đỉnh xuất phát.

- Thăm đỉnh v0, sau đó nếu v0 có đỉnh lân cận là v mà chưa được thăm thì quá
trình diễn ra tương tự như đối với v0.

- Khi thăm đến đỉnh v nào đó mà tất cả các đỉnh kề của v đều đã được thăm
(hoặc v không có đỉnh kề) thì quay lại đỉnh u mà từ u đã đến thăm v.

- Nếu u có đỉnh kề là v’ mà chưa được thăm thì một phép duyệt theo chiều sâu
bắt đầu từ v’ được thực hiện.

- Mỗi đỉnh chỉ được thăm một lần và kết thúc khi tất cả các đỉnh đều được
thăm.

b) Thuật toán:

Trong thuật toán ta có sử dụng:

1. Sử dụng hàm visited(v) để thực hiện thăm đỉnh v.

• Nếu visited(v)=1 thì đỉnh v đã được thăm.

• Nếu visited(v)=0 thì đỉnh v chưa được thăm.

2. Một thủ tục DFS(v0): Duyệt đồ thị theo chiều sâu xuất phát từ đỉnh v0.

Procedure DFS(v0);

Begin

1. visited(v0):=1; {thăm đỉnh v0}

2. for <các đỉnh kề v của v0> do

if visited(v)=0 then DFS(v)

End;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

→ Dựa vào thủ tục DFS(v0) thì thuật toán duyệt đồ thị theo chiều sâu như sau:

Begin

1. For u:=1 to n do visited(u):=0

{khởi tạo trạng thái đầu cho đồ thị là mọi đỉnh chưa được thăm}

2. For u:=1 to n do

if visited(u)=0 then DFS(u);

End;

Ví dụ:

→ Với đồ thị như hình vẽ thì thứ tự duyệt đồ thị theo chiều sâu:

• Xuất phát từ đỉnh A: A B C D F E G H

• Xuất phát từ đỉnh D: D B A C F E G H

5- Một số đơn đồ thị đặc biệt

5.1- Đồ thị đầy đủ.

- Đồ thị đầy đủ n đỉnh, ký hiệu bởi Kn là đơn đồ thị vô hướng mà giữa hai
đỉnh bất kỳ của nó luôn có cạnh nối.

- Đồ thị đầy đủ Kn có tất cả n(n-1)/2 cạnh, đó là đơn đồ thị có nhiều cạnh


nhất.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

5.2 Đồ thị vòng (Chu trình): Đồ thị vòng Cn, n≥3 gồm n đỉnh v1, v2,...,vn và các cạnh
(v1,v2), (v2,v3),..., (vn-1,vn),(vn,v1) (là một chu trình).

C3 C4 C5

5.3 Đồ thị bánh xe.

Ký hiệu là Wn thu được từ Cn bằng cách bổ xung vào một đỉnh mới nối với
tất cả các đỉnh của Cn

5.4 Đồ thị phân đôi.

Khi các đỉnh của đồ thị có thể chia thành hai tập con sao cho mỗi cạnh nối
một đỉnh của tập con này với một đỉnh của tập con kia.

Đồ thị phân đôi đầy đủ: Km,n, trong đó ‌│V1│=m, │V2│= n sao cho mỗi
đỉnh trong V1 được nối với mỗi đỉnh trong V2

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

5.5 Đồ thị lập phương.

Q1 Q2 Q3

6- Một vài ứng dụng của đồ thị đặc biệt

6.1 Các mạng cục bộ LAN

- Một số mạng cục bộ dùng cấu trúc hình sao, trong đó tất cả các thiết bị
được nối với thiết bị điều khiển trung tâm. Mạng cục bộ kiểu này có thể biểu diễn
bằng một đồ thị phân đôi đầy đủ K1,n. Các thông báo gửi từ thiết bị này tới thiết bị
khác đều phải qua thiết bị trung tâm. Mạng cục bộ cũng có thể có cấu trúc vòng
tròn, trong đó mỗi thiết bị nối với đúng hai thiết bị khác. Mạng cục bộ kiểu này có
thể biểu diễn bằng một đồ thị vòng Cn.

Mạng cục bộ kiểu này có thể biểu diễn bằng một đồ thị vòng C n. Thông báo
gửi từ thiết bị này tới thiết bị khác được truyền đi theo vòng tròn cho đến khi tới nơi
nhận.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Có thể một số mạng cục bộ dùng cấu trúc hỗn hợp của hai cấu trúc trên. Các
thông báo được truyền vòng quanh theo vòng tròn hoặc có thể qua thiết bị trung
tâm. Sự dư thừa này có thể làm cho mạng đáng tin cậy hơn. Mạng cục bộ kiểu này
có thể biểu diễn bằng một đồ thị bánh xe Wn.

6.2 Xử lý song song.

- Các thuật toán để giải quyết các bài toán để thiết kế để thực hiện một phép
toán tại mỗi thời điểm là thuật toán nối tiếp. Tuy nhiên, nhiều bài toán với số lượng
tính toán rất lớn như bài toán mô phỏng thời tiết, tạo hình trong y học hay phân tích
mật mã không thể giải được trong một khoảng thời gian hợp lý nếu dùng thuật toán
nối tiếp ngay cả khi dùng các siêu máy tính. Ngoài ra do nhưng giới hạn về mặt vật
lý đối với tốc độ thực hiện các phép toán cơ sở, nên thường gặp các bài toán không
thể giải trong khoảng thời gian hợp lý bằng các thao tác nối tiếp. Vì vậy người ta
phải nghĩ đến kiểu xử lý song song.

- Khi xử lý song song người ta dùng các máy tính có nhiều bộ xử lý riêng
biệt, mỗi bộ xử lý có bộ nhớ riêng, nhờ đó có thể khắc phục những hạn chế của các
máy nối tiếp, các thuật toán song song phân chia bài toán chính thành một số bài
toán con sao cho có thể giải đồng thời được. Do vậy bằng các thuật toán song song
và nhờ việc sử dụng các máy tính có bộ đa xử lý, người ta hi vọng có thể giải
nhanh các bài toán phức tạp. Trong thuật toán song song có một dãy các chỉ thị theo
dõi việc thực hiện thuật toán, gửi các bài toán con tới các bộ xử lý khác nhau,
chuyển các thông tin vào, thông tin ra tới các bộ vi xử lý thích hợp.

- Khi dùng cách xử lý song song, mỗi bộ xử lý có thể cần các thông tin ra của
các bộ xử lý khác. Do đó chúng cần phải được kết nối với nhau. Người ta có thể
dùng loại đồ thị thích hợp để biểu diễn dạng mạng kết nối các bộ xử lý trong một
máy tính có nhiều bộ xử lý. Kiểu mạng kết nối dùng để thực hiện một thuật toán
song song cụ thể phụ thuộc vào những yêu cầu với việc trao đổi dữ liệu giữa các bộ
xử lý, phụ thuộc vào tốc độ mong muốn và tất nhiên vào phần cứng hiện có.mạng
kết nối các bộ xử lý đơn giản nhất và cũng đắt nhất là có các liên kết hai chiều giữa
mỗi cặp bộ xử lý. Các mạng này có thể mô hình bằng đồ thị đầy đủ K n, trong đó n là

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

số bộ xử lý. Tuy nhiên, các mạng liên kết kiểu này có số kết nối quá nhiều mà tỏng
thực tế số kết nối cần phải có giới hạn.

Các bộ xử lý có thể kết nối đơn giản là sắp xếp chúng theo một mảng một
chiều. Ưu điểm của mảng một chiều là mỗi bộ xử lý có nhiều nhất hai đường nối
trực tiếp với các bộ xử lý khác. Nhược điểm là nhiều khi cần có rất nhiều các kết
nối trung gian để các bộ xử lý trao đổi thông tin với nhau.

Mạng kiểu lưới (hoặc mảng hai chiều) rất hay được dùng cho các mạng liên kết.
Trong một mạng như thế, số các bộ xử lý là một số chính phương, n=m 2. Các bộ xử
lý được gán nhãn P(i,j), 0≤i, j≤m-1. Các kết nối hai chiều sẽ nối bộ xử lý P(i,j) với
bốn bộ xử lý bên cạnh, tức là với p(i,j±1) và P(i±1,j) chừng nào các bộ xử lý còn ở
trong lưới.

Mạng kết nối quan trọng nhất là mạng kiểu siêu khối. Với các mạng kiểu này số
các bộ xử lý là kũy thừa của 2, n=2m. Các bộ xử lý gán nhãn P0,P1,....Pn-1. Mỗi bộ xử
lý có liên kết hai chiều với m bộ xử lý khác. Bộ xử lý P i nối với bộ xử lý có chỉ số
biểu diễn bằng dãy nhị phân khác với dãy nhị phân biểu diễn i tại đúng một bit.
Mạng kiểu siêu khối cân bằng số các kết nối trực tiếp của mỗi bộ xử lý và số các kết
nối gián tiếp sao cho các bộ xử lý có thể truyền thông được. Nhiều máy tính đã chế

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

tạo theo kiểu mạng siêu khối và nhiều thuật toán đã được thiết kế để sử dụng mạng
kiểu siêu khối. Đồ thị lập phương Qm biểu diễn mạng kiểu siêu khối có 2m bộ xử lý.

7- Đồ thị Euler

Có thể coi năm 1736 là năm khai sinh lý thuyết đồ thị, với việc công bố lời giải
“ bài toán về các cây cầu” ở Konigsberg của nhà toán học lỗi lạc Euler (1707-1783).
Thành phố Konigsberg thuộc Phổ (nay thuộc Lalinngrad thuộc Nga) được chia
thành bốn vùng bằng các nhánh sông Pregel, các vùng này gồm hai vùng bên bờ
sông, đảo Kneiphof và một miền nằm giữa hai nhánh của sông Pregel. Vào thế kỷ
18, người ta xây bảy cây cầu nối các vùng này với nhau. Vào chủ nhật người dân ở
đây thường đi bộ dọc theo các phố, hỏi tự hỏi không biết có thể xuất phát tại một
điểm nào trong thành phố đi qua tất cả các cầu, mỗi cây cầu đi qua đúng một lần, rồi
lại trở về điểm xuất phát được không? Nếu ta coi mỗi khu vực A, B, C, D như một
đỉnh và mỗi cây cầu qua lại khu vực là một cạnh nối hai đỉnh thìta có sơ đồ của
Konigsberg là một đa đồ thị G như hình dưới.

Bài toán tìm đường đi qua tất cả các cầu mỗi cầu chỉ đi qua một lần có thể được
biểu diễn bằng mô hình đa đồ thị như sau:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

7.1- Định nghĩa:

Định nghĩa 1: đồ thị liên thông G được gọi là đồ thị Euler nếu tồn tại một chu
trình đi qua tất cả các cạnh của đồ thị, mỗi cạnh đúng một lần.

Định nghĩa 2: Chu trình Euler trong đồ thị G là chu trình đi qua tất cả các cạnh
của đồ thị, mỗi cạnh đúng một lần.

Định nghĩa 3: Đường đi Euler trong đồ thị G là đường đi qua tất cả các cạnh
của đồ thị, mỗi cạnh đúng một lần.

Từ định nghĩa trên ta thấy rằng mỗi chu trình Euler là một đường Euler đóng.

Định nghĩa 4: Đồ thị liên thông G được gọi là đồ thị nửa Euler nếu tồn tại một
đường đi trong G qua tất cả các cạnh của đồ thị , mỗi cạnh đúng một lần.

7.2 Định lý cơ bản

Định lý 1: Đồ thị liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều
có bậc chẵn.

Hệ quả: đồ thị liên thông G là nửa Euler khi và chỉ khi nó có không quá hai
đỉnh bậc lẻ.

Định lý 2: cho G=(V,E) là đồ thị liên thông. Điều kiện cần và đủ để đồ thị có
đường đi Euler là số đỉnh bậc lẻ trong đồ thị phải là 0 hoặc 2.

Ví dụ:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

G1 G2

Đồ thị G1 liên thông và có hai đỉnh bậc lẻ do đó có đường đi Euler.

Đồ thị G2 là liên thông, nhưng số đỉnh bậc lẻ là 4 do đó không có đường


Euler.

7.3 Thuật toán Flor xác định chu trình Euler của G (nếu có).

Thuật toán Flor:

- Bước 1: kiểm tra xem G có phải là đồ thị liên thông hay không?

a) Nếu G là đồ thị liên thông thì chuyển sang bước 2.

b) Nếu G không là liên thông thì dừng thuật toán và kết luận là chu trình không
có chu trình Euler.

- Bước 2: kiểm tra xem mọi đỉnh của G đều có bậc chẵn hay không?

a) Nếu mọi đỉnh của G đều là bậc chẵn thì chuyển sang bước 3.

b) Nếu mọi đỉnh của G không phải bậc chẵn thì dừng thuật toán và kết luận
rằng đồ thị không có chu trinh Euler.

- Bước 3: xây dựng các chu trình đơn trong G sao cho tất cả các cạnh của đồ
thị đều có chu trình đơn đi qua và mỗi cạnh chỉ đi qua đúng một lần. Sau đó
ghép các chu trình đơn tại các điểm chung thì ta được chu trình Euler cần
tìm.

Cụ thể:

- Xuất phát từ một đỉnh v của đồ thị , người ta xây dựng chu trình đơn p1. Sau
đó người ta đánh dâu xóa các cạnh của chu trình đơn p1. Nếu trong quá trình
đánh dấu xóa tạo nên các đỉnh cô lập mới thì ta loại bỏ các đỉnh cô lập này ra
khỏi đồ thị và ta thu G1là tập con của G

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

- Tiếp tục lặp lại quá trình trên tại một đỉnh chung p1 và G1 để xây dựng chu
trình đơn p2 và cứ như vậy ta xây dựng được chu trình đơn pk.

- Cuối cùng ghép p1, p2,..., pk tại một đỉnh chung ta thu được chu trình Euler
cần tìm. Thủ tục để xác định chu trình Euler.

Procedure Euler (G liên thông, mọi đỉnh đều bậc chẵn);

{S:Stack: Lưu tất cả các đỉnh của đồ thị được xét đến; CE: Tập lưu các đỉnh
của chu trình Euler; ┌(x): Tập lưu danh sách các đỉnh kề của đỉnh x}

Begin

1. S:=ø; CE:= ø;

2. Chọn uЄ V của đồ thị làm đỉnh xuất phát;

3. S←u; {đưa u vào S}

4. While S<>ø do

Begin

X:=top(S); {x là đỉnh đầu tiên của Stack}

If ┌(x)≠ø then

Begin

+ y:=<đỉnh đầu tiên trong danh sách đỉnh kề


của x>

+ S←y; {đưa đỉnh y vào S}

+ <xóa cạnh (x,y) khỏi đồ thị>;

End

Else

Begin

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

S:=S-[x]; CE:=CE+[x];

End;

End;

End;

7.4 Định lý: Đồ thị có hướng là liên thông yếu G là đồ thị Euler khi và chỉ khi
mọi đỉnh của G đều có bậc vào bằng bậc ra.

Bổ đề: nếu bán bậc vào và bán bậc ra của mỗi đỉnh của đồ thị có hướng G
không nhỏ hơn 1 thì G chứa chu trình đơn.

Hệ quả: Đồ thị có hướng liên thông yếu G là nửa Euler ( mà không là Euler)
khi và chỉ khi tồn tại hai đỉnh x và y sao cho:

Deg-(x)= deg+(x)+1; deg+(y)=deg-(y)+1, deg+(v)= deg-(v), với mọi vЄV, v≠x,


v≠y.

8- Đồ thị Hamilton.

Xuất phát từ trò chơi đố vui “Vòng quanh Thế Giới” do WilliamRowan
Hamilton, nhà toán học người Ailen đưa ra năm 1857. Cho một hình thập nhị diện
đều (đa diện đều có 12 mặt, 20 đỉnh và 30 cạnh), mỗi đỉnh của hình mang tên một
thành phố nổi tiếng, mõi cạnh của hình là đường đi lại giữa các thành phố tương
ứng. Xuất phát từ một thành phố. Hãy tìm đường đi thăm tất cả các thành phố khác
nhau, mỗi thành phố đúng một lần rồi trở về thành phố xuất phát.

Trước Hamilton, từ thời Euler, người ta đã biết đến một câu đố hóc búa về
“đường đi của con mã trên bàn cờ”. Trên bàn cờ, con mã chỉ có thể đi theo đường
chéo của hình chữ nhật 2×3 hoặc 3×2 ô vuông. Giả sử bàn cờ có 8×8 ô vuông. Hãy
tìm đường đi của con mã đi thăm tất cả các ô của bàn cờ, mỗi ô chỉ một lần rồi trở
lại ô xuất phát. Bài toán này được nhiều nhà toán học chú ý, đặc biệt là Euler, De
Moivre, vandermonde,...

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Hiện nay đã có nhiều lời giải và phương pháp giải cũng có nhiều, trong đó có
quy tắc: mỗi lần bố trí một con mã ta chọn vị trí mà tại vị trí này số ô chưa dùng tới
do nó khống chế là ít nhất. Một phương pháp khác dựa trên tính đối xứng của hai
nửa bàn cờ. Ta tìm hành trình của con mã trên nửa bàn cờ. Rồi lấy đối xứng qua
nửa bàn cờ còn lại, sau đó nối hành trình hai nửa đã tìm lại với nhau.

Trò trên và câu đố nói trên dẫn tới việc khảo sát một lớp đồ thị đặc biệt, đó là
đồ thị Hamilton.

Định nghĩa 1: Đồ thị liên thông G được gọi là đồ thị Hamilton nếu tồn tại một
chu trình đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần.

Định nghĩa 2: chu trình Hamilton trong đồ thị G=(V,E) là chu trình đi qua tất
cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần.

Định nghĩa 3: Đường đi Hamilton trong đồ thị G=(V,E) là đường đi qua tất cả
các đỉnh của đồ thị, mỗi đỉnh đúng một lần.

Ví dụ:

G1 G2 G3

G1 có chu trình Hamilton a, b, c, d, e, c, a

G2 không có chu trình Hamilton nhưng có đường đi Hamilton a, b, c, d

G3 có chu trình Hamilton a, c, b, d, a.

Định lý Rédei: Nếu G là một đồ thị có hướng đầy đủ thì G là đồ thị Hamilton.

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Định lý Dirac: Nếu G là một đơn đồ thị có n đỉnh và mọi đỉnh của G đều có bậc
không nhỏ hơn n/2 thì G là một đồ thị Hamilton.

Hệ quả: Nếu G là một đơn đồ thị có n đỉnh và bất kỳ hai đỉnh nào không kề
nhau cũng có tổng số bậc không nhỏ hơn n thì G là đồ thị Hamilton.

Định lý *: Nếu G là đồ thị phân đôi với hai cặp đỉnh là V1 và V2 có số đỉnh
cùng bằng n (n≥2) và bậc của mỗi đỉnh lớn hơn n/2 thì G là một đồ thị Hamilton.

Định lý: Đồ thị đầy đủ Kn với n lẻ và n≥3 có đúng (n-1)/2 chu trình Hamilton
phân biệt.

Thuật toán tìm chu trình Hamilton:

Thuật toán liệt kê tất cả chu trình Hamilton của đồ thị, dựa trên cơ sở thuật toán
quay lui. {Các chu trình Hamilton thu được bằng việc phát triển dãy đỉnh
v[1],...,v[k-1] của đồ thị cho bởi danh sách ke(u), uЄV. Hàm chuaxet[v] nhận True
nếu v chưa được xét đến, nhận False nếu v đã được xét đến, v0 là đỉnh xuất phát bất
kỳ của chu trình}

Procedure Hamilton(k);

Begin

For uЄ ke[v[k-1]) do

Begin

V[k]:=u;

chuaxet[u]:=false;

If (k:=n+1) and (u=v0) then ghinhan(v[1],..,v[n], v0)

Else Hamilton(k+1);

Chuaxet[y]:=true;

End;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

End;

//* Main Program *//

Begin

For vЄ V do chuaxet[v]:=true;

{Khởi tạo mọi đỉnh đầu của đồ thị đều chưa được xét}

V[1]:=v0;

Chuaxet[v0]:=false;

Hamilton(2);

End.

II-Thuật toán xác định có hay không đường đi giữa hai đỉnh bất kì của đồ thị
G=(V,E) cho trước:

1. Toàn bộ source của chương trình:

Program duyetdothi;
uses crt, graph;
type
dothi=array[1..10,1..10] of integer;
toado=record
x,y:integer;
end;
var
n,a,c:integer;
b:array[1..10] of boolean;
m:array[1..10] of toado;
v:dothi;
xacdinh:boolean;
Procedure nhap;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

var
i,j:integer;
begin

writeln;
writeln;
writeln(' THAO LUAN TOAN ROI RAC');
writeln;
writeln(' Nhom thao luan II');
writeln;
writeln(' Thuat toan xac minh duong di tu dinh A den dinh
B cua do thi V');
writeln;
writeln;
repeat write(' So dinh cua do thi:');readln(n);
until (n>0) and (n<=10);
repeat
write(' Diem dau:');readln(a);
until (0<a) and (a<=n);
repeat
write(' Diem cuoi:');readln(c);
until(0<c) and (c<=n);
for i:=1 to n do
for j:=1 to n do
begin
repeat
write(' V(',i,j,')=');
readln(v[i,j]);
until (v[i,j]=0) or (v[i,j]=1);
end;
end;
Procedure check(x:integer);
var i:integer;
begin
i:=0;
if a<>c then
begin

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

if x=c then
xacdinh:=true;
b[x]:=false;
for i:=1 to n do
if (v[x,i]=1) and (b[i]=true) and (xacdinh=false) then
check(i);
end
else if v[a,c]=1 then xacdinh:=true;
end;
procedure khoitao;
var gd,gm,i:integer;
begin
clrscr;
writeln;
writeln;
for i:=1 to n do b[i]:=true;
xacdinh:=false;
gd:=0;
InitGraph(gd,gm,'’);
if Grok<>0 then
begin
writeln('loi do hoa');
readln;
Halt(1);
end;
setbkcolor(blue);
end;
Procedure hinhtron1(x,y,a:integer);
var s:string[2];
begin
str(a,s);
setcolor(yellow);
circle(x,y,16);
setcolor(white);
outtextxy(x-3,y-2,s);
end;
Procedure hinhtron2(x,y,a:integer);

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

var s:string[2];
begin
str(a,s);
setcolor(red);
circle(x,y,16);
setcolor(white);
outtextxy(x-3,y-2,s);
end;
Procedure dinhvi(x1,y1,x2,y2:integer; var a1,a2,b1,b2:integer);
begin
if (x2>x1) and (y2>y1) then
begin
a1:=x1+11;
a2:=y1+11;
b1:=x2-11;
b2:=y2-11;
end;
if (x2<x1) and (y2>y1) then
begin
a1:=x1-11;
a2:=y1+11;
b1:=x2+11;
b2:=y2-11;
end;
if (x2<x1) and (y2<y1) then
begin
a1:=x1-11;
a2:=y1-11;
b1:=x2+11;
b2:=y2+11;
end;
if (x2>x1) and (y2<y1) then
begin
a1:=x1+11;
a2:=y1-11;
b1:=x2-11;
b2:=y2+11;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

end;
end;
procedure laytoadodinh;
begin
m[1].x:=50;
m[1].y:=215;
m[2].x:=200;
m[2].y:=224;
m[3].x:=81;
m[3].y:=340;
m[4].x:=293;
m[4].y:=401;
m[5].x:=225;
m[5].y:=303;
m[6].x:=349;
m[6].y:=341;
m[7].x:=82;
m[7].y:=406;
m[8].x:=280;
m[8].y:=160;
m[9].x:=112;
m[9].y:=157;
m[10].x:=164;
m[10].y:=375;
end;
procedure vedinh(k,h:integer);
begin
if h=1 then hinhtron1(m[k].x,m[k].y,k)
else hinhtron2(m[k].x,m[k].y,k)
end;
Procedure taomuiten(x1,y1,x2,y2:integer;var x,y:longint);
var
d,e,m,t,a1,a2,b1,b2:real;
begin
d:=x2-x1;
e:=y2-y1;
m:=20;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

t:=m/sqrt(d*d+e*e);
a1:=d*t+x2;
a2:=e*t+y2;
b1:=-d*t+x2;
b2:=-e*t+y2;
if (a1-x1)*(a1-x2)+(a2-y1)*(a2-y2)<0 then
begin
x:=round(a1);
y:=round(a2);
end
else
begin
x:=round(b1);
y:=round(b2);
end;
end;
Procedure noidinh(x,y:integer);
var
i,a1,a2,b1,b2:integer;
a11,a22:longint;
begin
setcolor(green);
dinhvi(m[x].x,m[x].y,m[y].x,m[y].y,a1,a2,b1,b2);
line(a1,a2,b1,b2);
setcolor(red);
taomuiten(a1,a2,b1,b2,a11,a22);
for i:=1 to 2 do circle(a11,a22,i);

end;
procedure vedinhdothi;
var
h,i,j:integer;
begin
for i:=1 to n do vedinh(i,1);
end;
procedure vedothi;
var

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

i,j:integer;
begin
i:=0;
j:=0;
for i:=1 to n do vedinh(i,1);
for i:=1 to n do
for j:=1 to n do
if (v[i,j]=1) then
if i<>j then noidinh(i,j)
else vedinh(i,2);
end;
Procedure noidinh2(x,y:integer);
var
i,a1,a2,b1,b2:integer;
a11,a22:longint;
begin
setcolor(white);
dinhvi(m[x].x,m[x].y,m[y].x,m[y].y,a1,a2,b1,b2);
line(a1,a2,b1,b2);
setcolor(red);
taomuiten(a1,a2,b1,b2,a11,a22);
for i:=1 to 2 do circle(a11,a22,i);
end;
var
i,j,h,u:integer;

l1,l2:string[2];
Begin
clrscr;
nhap;
khoitao;
check(a);
outtextxy(40,40,'THAO LUAN TOAN ROI RAC');
outtextxy(40,60,'Nhom Thao Luan II');
setcolor(green);
outtextxy(40,80,'***** WWW.BeautifulLife.Cwahi.net *****');
setcolor(white);

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

if xacdinh=true then
begin
moveto(40,100);
outtext('Co duong di tu dinh ');
str(a,l1);
str(c,l2);
outtext(l1);
outtext(' toi dinh ');
outtext(l2);
end
else
begin
moveto(40,100);
outtext('Khong co duong di tu dinh ');
str(a,l1);
str(c,l2);
outtext(l1);
outtext(' toi dinh ');
outtext(l2);
end ;
laytoadodinh;
vedothi;
readln;
closegraph;
khoitao;
moveto(250,200);
outtext('!... BYE BYE ...!');
delay(4000);
closegraph;
End.

2. Phân tích nội dung thật toán:

Biểu diễn đồ thị băng ma trận kề V, số đỉnh tối đa của đồ thị là 10, nhập vào số
đỉnh của đồ thị (n), đỉnh đầu (a đỉnh ) và đỉnh cuối (đỉnh c).

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

Ta sử dụng mảng B gồm n phẩn tử kiểu Boolean để đánh dấu các đỉnh đã đi qua
khi duyệt đồ thị, dung biến “xacdinh” có kiểu Boolean để xác định xem có đường đi
từ đỉnh a tới đỉnh c không? Nếu kết thúc thủ tục check, biến Boolean mang giá trị
true thì kết luận là có xuất hiện đường đi từ đình a tới đỉnh c, ngược lại thì kết luận
khôn g có đường đi từ đỉnh a tới đỉnh c.

Thủ tục check như sau:

type
dothi=array[1..10,1..10] of integer;
var
n,a,c:integer;
b:array[1..10] of boolean;
v:dothi;
xacdinh:boolean;

Procedure check(x:integer);{kiểm tra xem từ đỉnh x đã trùng với


đỉnh c chưa?}
var i:integer;
begin
i:=0;
if a<>c then
begin
if x=c then
xacdinh:=true;
b[x]:=false;
for i:=1 to n do
if (v[x,i]=1) and (b[i]=true) and (xacdinh=false) then
check(i);
end
else if v[a,c]=1 then xacdinh:=true;
end;

Trong chương trình chính ta dùng thủ tục nhập ( để nhập vào đồ thị), gọi hàm
khởi tạo ( khởi tạo giá trị true cho tất cả các phần tử trong mảng B, khởi tạo giá

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

trịn false cho biến “xacdinh”, khởi tạo chế độ đồ họa) rồi gọi hàm check(a) (Bắt
đầu kiểm tra từ đỉnh đầu, và thực hiện đệ quy quá trình cho tới khi đỉnh kiểm tra
trùng với đỉnh c hoặc tất cả các đỉnh mà có thể với từ a đã kiểm tra hết).

Thủ tục nhập, khởi tạo và thủ tục check như sau:

Procedure nhap;
var
i,j:integer;
begin

writeln;
writeln;
writeln(' THAO LUAN TOAN ROI RAC');
writeln;
writeln(' Nhom thao luan II');
writeln;
writeln(' Thuat toan xac minh duong di tu dinh A den dinh B
cua do thi V');
writeln;
writeln;
repeat write(' So dinh cua do thi:');readln(n);
until (n>0) and (n<=10);
repeat
write(' Diem dau:');readln(a);
until (0<a) and (a<=n);
repeat
write(' Diem cuoi:');readln(c);
until(0<c) and (c<=n);
for i:=1 to n do
for j:=1 to n do
begin
repeat
write(' V(',i,j,')=');
readln(v[i,j]);
until (v[i,j]=0) or (v[i,j]=1);
end;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

end;

(*=======================================================*)

procedure khoitao;
var gd,gm,i:integer;
begin
clrscr;
writeln;
writeln;
for i:=1 to n do b[i]:=true;
xacdinh:=false;
gd:=0;
InitGraph(gd,gm,'d:\tp\bgi');
if Grok<>0 then
begin
writeln('loi do hoa');
readln;
Halt(1);
end;
setbkcolor(blue);
end;

(*=======================================================*)

Procedure check(x:integer);
var i:integer;
begin
i:=0;
if a<>c then
begin
if x=c then
xacdinh:=true;
b[x]:=false;
for i:=1 to n do
if (v[x,i]=1) and (b[i]=true) and (xacdinh=false) then
check(i);

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

end
else if v[a,c]=1 then xacdinh:=true;
end;

(*=======================================================*)

Begin
clrscr;
nhap;
khoitao;
check(a);
outtextxy(40,40,'THAO LUAN TOAN ROI RAC');
outtextxy(40,60,'Nhom Thao Luan II');
setcolor(green);
outtextxy(40,80,'***** WWW.BeautifulLife.Cwahi.net *****');
setcolor(white);
if xacdinh=true then
begin
moveto(40,100);
outtext('Co duong di tu dinh ');
str(a,l1);
str(c,l2);
outtext(l1);
outtext(' toi dinh ');
outtext(l2);
end
else
begin
moveto(40,100);
outtext('Khong co duong di tu dinh ');
str(a,l1);
str(c,l2);
outtext(l1);
outtext(' toi dinh ');
outtext(l2);
end ;
laytoadodinh;

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

vedothi;
readln;
closegraph;
khoitao;
moveto(250,200);
outtext('!... BYE BYE ...!');
delay(4000);
closegraph;
End.

(Thực tế ta đã thực hiện thuật toán duyệt đồ thị theo chiều sâu, và dừng quá trình
duyệt khi phát hiện có đường đi từ đỉnh a tới đỉnh c).

Thái Nguyên, tháng 12 năm 2009.

Nhóm thảo luận2!

NHẬN XÉT CỦA GIÁO VIÊN

.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
.......................................................................................................................................
...........................

MỤC LỤC

I-Đồ thị và các khái niệm liên quan

1-Các khái niệm

2- Biểu diễn đồ thị

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

2.1 Biểu diễn bằng ma trận kề

2.2 Biểu diễn đồ thị bằng ma trận liên thuộc

2.3 Biểu diễn đồ thị bằng danh sách kề

2.4 Biểu diễn đồ thị bằng danh sách kề

3- Bậc, đường đi, chu trình và tính liên thông

3.1 Bậc của đỉnh

3.2 Đường đi và chu trình

3.3 Sự liên thông

3.4 Các định lý cơ bản về đồ thị

4- Các phương pháp duyệt đồ thị

3.5 Duyệt đồ thị theo chiều rộng (BFS- Breadth First Search)

3.6 Duyệt đồ thị theo chiều sâu (DFS- Depth First Search)

5- Một số đơn đồ thị đặc biệt

5.1- Đồ thị đầy đủ.

5.3 Đồ thị bánh xe.

5.4 Đồ thị phân đôi.

5.5 Đồ thị lập phương.

6- Một vài ứng dụng của đồ thị đặc biệt

6.1 Các mạng cục bộ LAN

6.2 Xử lý song song.

7- Đồ thị Euler

7.1- Định nghĩa:

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

7.2 Định lý cơ bản

7.3 Thuật toán Flor xác định chu trình Euler của G (nếu có).

7.4 Định lý

8- Đồ thị Hamilton.

II_Thuật toán xác định có hay không đường đi giữa hai đỉnh bất kì của đồ thị
G=(V,E) cho trước:

1- Toàn bộ source của chương trình

2- Phân tích nội dung thật toán

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

TÀI LIỆU THAM KHẢO

1- Giáo trình toán rời rạc- Bộ Môn Khoa học máy tính

2- Thuật toán trong máy tính- Việt Anh

3- Giáo trình toán rời rạc- Đỗ Đức Giáo

4- Toán rời rạc và ứng dụng trong tin học- Rosen

5- Internet (http://vi.wikipedia.org)

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

KHOA CÔNG NGHỆ THÔNG TIN

BỘ MÔN KHOA HỌC MÁY TÍNH

-------------o0o------------

BÁO CÁO THẢO LUẬN

Môn học :TOÁN RỜI RẠC

Chủ đề: ĐỒ THỊ VÀ THUẬT TOÁN BAO ĐÓNG BẮC


CẦU

Nhóm 2

Các sinh viên:

1. Nguyễn Thị Thanh


2. Dương Bách Tiến

1
Published by ductrong90ictu@gmail.com -- WWW.BeautifulLife.Cwahi.net

3. Nguyễn Đức Trọng


4. Nguyễn Thị Phượng
5. Nguyễn Thị Quyến
6. Tạ Văn Trung
7. Nguyễn Xuân Trường

Thái Nguyên, tháng 12 năm 2009

You might also like