63
1 Published by [email protected] -- 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.

Cơ bản về đồ thị

Embed Size (px)

DESCRIPTION

Cơ bản về đồ thị---------------www.beautiullife.cwahi.net

Citation preview

1

Published by [email protected] -- 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.

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

- Đồ 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ụ:

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

v1 v2 v3 v4

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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ú ý:

• 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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

• 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ố C ij

đượ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

∞ ∞ 8 4 0

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

Ư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

3 1 0 0 0 0 0 0

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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ề

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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

var G:graph;

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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)).

• 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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

• 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.

- Độ 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 đó.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

- 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.

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).

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

- Đồ 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ệ:

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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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 n i 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ó:

- 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ẻ.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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:

- 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 v0 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:

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

- 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

+ 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:

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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:

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

→ 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ụ:

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

→ 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.

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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

Q1 Q2 Q3

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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 Cn. 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.

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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 đủ Kn, trong đó n là

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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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ế

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

đ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:

G

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

Đị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ụ:

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?

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

- 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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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,...

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ụ:

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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.

Đị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}

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

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.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

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);

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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,'’);

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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);

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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

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;

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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;

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;

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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);

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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);

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);

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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).

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;

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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á

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;

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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 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;

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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);

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 ');

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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.

(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 [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1

Published by [email protected] -- 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ị

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 đủ.

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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:

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 [email protected] -- 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 [email protected] -- 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

1

Published by [email protected] -- WWW.BeautifulLife.Cwahi.net

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

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