Tải bản đầy đủ (.pdf) (53 trang)

Một số bài toán trong lý thuyết đồ thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (700.63 KB, 53 trang )

TRƢỜNG ĐẠI HỌC VINH
KHOA CƠNG NGHỆ THƠNG TIN

KHĨA LUẬN

TỐT NGHIỆP ĐẠI HỌC
Đề tài:

Một số bài tốn trong lí thuyết đơ thị

Sinh viên thực hiện:

LÊ THỊ DUNG
Giáo viên hướng dẫn:

THS. TRẦN XUÂN SANG

Vinh 5/2009

1


GIỚI THIỆU ĐỀ TÀI
A. Giới thiệu chung
Bước sang thế kỷ 21, nhìn lại thế kỷ 20 là thế kỷ mà con người đạt được
nhiều thành tựu khoa học rực rỡ nhất, một trong những thành tựu đó là sự bùng
nổ của ngành khoa học máy tính. Sự phát triển kỳ diệu của máy tính trong thế kỷ
này gắn liền với sự phát triển tốn học hiện đại, đó là tốn rời rạc.
Toán học rời rạc nghiên cứu các cấu trúc có tính chất rời rạc khơng liên
tục. Tốn rời rạc bao gồm các lĩnh vực như: quan hệ, lý thuyết đồ thị, logíc tốn,
ngơn ngữ hình thức,... trong đó lý thuyết đồ thị là một bộ phận trọng tâm với


nhiều khối lượng kiến thức khá lý thú và được nghiên cứu nhiều nhất.
Tốn rời rạc nói chung và lý thuyết đồ thị nói riêng là cơng cụ thiết yếu
cho nhiều ngành khoa học kỹ thuật, và là một thành phần quan trọng trong học
vấn đối với sinh viên các ngành kỹ thuật đặc biệt sinh viên ngành Tin học. Lý
thuyết đồ thị, với cách tiếp cận đối tượng nghiên cứu và phương pháp tư duy khá
độc đáo thực sự ngày càng hữu ích có nhiều ứng dụng phong phú và gây khơng
ít bất ngờ. Máy tính mà bản thân nó với các q trình làm việc mang tính rời rạc,
nên điều này tương hợp gắn chặt lý thuyết đồ thị với cơng nghệ máy tính trong
việc nghiên cứu các đối tượng có tính chất rời rạc.
Trên thực tế nhiều bài toán liên quan đến một tập các đối tượng và mối
liên hệ giữa chúng, địi hỏi tốn học phải đặt ra một mơ hình biểu diễn 1 cách
chặt chẽ và tổng qt bằng ngơn ngữ kí hiệu đó là đồ thị. Những ý tưởng cơ bản
của nó được đưa ra từ thế kỉ thứ XVIII bởi nhà toán học thuỵ sỹ Leonhard Euler,
ơng đã dùng mơ hình đồ thị để giải bài toán về những cây cầu Konigsbirg nổi
tiếng.
Mặc dù lí thuyết đồ thị đã được khoa học phát triển từ rất lâu nhưng lại có
nhiều ứng dụng hiện đại. Đặc biệt trong khoảng vài mươi năm trở lại đây, cùng
2


với sự ra đời của máy tính điện tử và sự phát triển nhanh chóng của tin học, lí
thuyết đồ thị càng được quan tâm đến nhiều hơn. Đặc biệt là các thuật tốn trên
đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: Mạng máy
tính, Lí thuyết mã, Tối ưu hố….
B. Mục đích của đề tài
Trong phạm vi luận văn này chỉ nghiên cứu về một số bài tốn trong lí
thuyết đồ thị: Bài tốn tìm chu trình Euler với thuật tốn Fleury và phương pháp
sử dụng ngăn xếp, Bài tốn tìm đường đi ngắn nhất với các Thuật toán Dijkstra,
Ford_Bellman, Ployd
C. Cấu trúc của đề tài

Chương I: Một số vấn đề cơ bản của đồ thị
Chương II: Bài tốn tìm đường đi ngắn nhất


Thuật tốn Dijkstra



Thuật tốn Ford_Bellman



Thuật tốn Ployd

Chương III: Bài tốn tìm chu trình Euler


Thuật tốn Fleury



Phương pháp sử dụng ngăn xếp

3


CHƢƠNG 1
MỘT SỐ VẤN ĐỀ CƠ BẢN CỦA ĐỒ THỊ
1.1. Các định nghĩa đồ thị
1.1.1. Định nghĩa đồ thị

Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh
này, các loại đồ thị khác nhau được phân biệt bởi kiểu và số lượng cạnh nối hai
đỉnh nào đó của đồ thị.
Giả sử V là tập hữu hạn, không rỗng các phần tử nào đó và E  V  V. Bộ
G = <V,E> được gọi là đồ thị hữu hạn. Mỗi phần tử v  V gọi là một đỉnh và mỗi
phần tử e = (u,v)  E gọi là một cạnh của đồ thị G = <V,E>.
Xét một cạnh e  E khi đó tồn tại 2 đỉnh u,v  V sao cho e = (u, v), ta nói rằng
u nối với v hoặc u và v thuộc e.

e
u

v

- Nếu cạnh e = (u, v) mà u và v là hai đỉnh phân biệt thì ta nói u, v là hai đỉnh kề
nhau.
- Nếu e = (v, v) thì e là cạnh có hai đỉnh trùng nhau ta gọi đó là một khuyên.
- Nếu e = (u, v) mà u,v là cặp đỉnh có phân biệt thứ tự hay có hướng từ u đến v
thì e là một cung, khi đó u là gốc còn v là ngọn hoặc u là đỉnh ra, v là đỉnh vào.
- Khi giữa cặp đỉnh (u,v) có nhiều hơn một cạnh thì ta nói những cạnh cùng cặp
đỉnh là những cạnh song song hay là cạnh bội.

4


uu

v

v


u

a)

b)

a. Tại đỉnh u có một khuyên

v

c)

b. Một cung có hướng từ u sang v

c. Cặp đỉnh (u,v) có 2 cạnh song song
Hình 1.1
Trong thực tế ta có thể gặp nhiều vấn đề mà có thể dùng mơ hình đồ thị để biểu
diễn, như sơ đồ một mạng máy tính, sơ đồ mạng lưới giao thông, sơ đồ thi công
một cơng trình.
Ví dụ: Xét một mạng máy tính, có thể biểu diễn mạng này bằng một mơ hình đồ
thị, trong đó mỗi máy là một đỉnh, giữa các máy được nối với nhau bằng các dây
truyền, chúng tương ứng là các cạnh của đồ thị. Một mơ hình mạng máy tính
Hình 1.2 trong đó có các máy tính A, B, C, D tương ứng là các đỉnh, giữa 2 máy
được nối trực tiếp với nhau thì tương ứng với 1 cặp đỉnh kề nhau.
A

B

C


D

Hình 1.2. Ví dụ về một đồ thị
1.1.2. Đồ thị đơn
Đồ thị G = <V, E> được gọi là đồ thị đơn nếu giữa hai đỉnh bất kỳ được
nối với nhau bởi không quá một cạnh (cung), tức là đồ thị khơng có cạnh bội,
khơng có khun. (Hình 1.2 là một ví dụ về đồ thị đơn).

5


2.1.3. Đa đồ thị
Đồ thị G = <V,E> được gọi là đa đồ thị nếu nó có ít nhất một cặp đỉnh
được nối với nhau bởi hai cạnh (hai cung) trở lên.
2.1.4. Giả đồ thị
Là đồ thị có ít nhất một khuyên, có thể chứa cạnh bội, cạnh đơn. Tóm lại
đây là loại đồ thị tổng quát nhất.

B

A

C

D

B

A


C

D

a)

b)

Hình 1.3 a. Đa đồ thị

b. Giả đồ thị

1.2. Các loại đồ thị
1.2.1. Đồ thị vô hướng
Đồ thị G = <V,E> được gọi là đồ thị vô hướng nếu tất cả các cạnh e  E mà
cặp đỉnh thuộc nó e = (u,v)  V không phân biệt thứ tự. Đồ thị vô hướng là đồ
thị khơng có bất kỳ một cung nào.
Hình 1.3.a biểu diễn của một đồ thị vô hướng.
1.2.2. Đồ thị có hướng
Đồ thị G = <V,E> được gọi là đồ thị có hướng nếu tất cả các cạnh e  E
mà cặp đỉnh thuộc nó e = (u,v)  V có phân biệt thứ tự. Đồ thị có hướng là đồ thị
mà mọi e = (u,v)  V đều là cung.

6


C
B


A

Hình 2.1 Đồ thị có hướng
1.2.3. Đồ thị hỗn hợp
Đồ thị G = <V,E> vừa có cạnh vơ hướng, vừa có cạnh có hướng thì nó
được gọi là đồ thị hỗn hợp. Loại đồ thị này rất ít khi được dùng tới.
Vấn đề phân chia đồ thị và các thuật ngữ về đồ thị chỉ mang tính tương đối, hiện
nay vẫn cịn chưa mang tính thống nhất chuẩn trên nhiều tài liệu.
1.3. Một số khái niệm và tính chất cơ bản của đồ thị
1.3.1. Bậc đồ thị
a. Bậc đồ thị vô hướng
Cho đồ thị vô hướng G = <V,E>. Xét 1 đỉnh v  V đặt m(v) là số cạnh
thuộc đỉnh v khi đó m(v) được gọi là bậc của đỉnh v. Nếu v có một khun thì
m(v) được cộng thêm 2.

v

v

m(v) = 3

m(v) = 2

- Nếu m(v) = 0 thì đỉnh v được gọi là đỉnh cơ lập
- Nếu m(v) = 1 thì đỉnh v được gọi là đỉnh treo
Ta đặt

m(G)   m(v) ,
vV


thì m(G) được gọi là bậc của đồ thị vô hướng G = <V,E>.

7


b. Bậc đồ thị có hướng
Cho đồ thị có hướng G = <V,E> xét 1 đỉnh v  V, ký hiệu m+(v) là số các
cung vào của đỉnh v, còn m-(v) là số các cung ra khỏi v. Khi đó ta gọi m+(v) là
bậc vào của đỉnh v còn m-(v) là bậc ra của đỉnh v.
- Nếu m+(v) + m-(v) = 0 thì đỉnh v được gọi đỉnh là cơ lập
- Nếu m+(v) + m-(v) = 1 thì đỉnh v được gọi là đỉnh treo
Ta đặt

m(G)   m  (v)   m  (v) .
vV

vV

Khi đó m(G) được gọi là bậc của đồ thị có hướng G = <V,E>.
Trong đồ thị có hướng thì m+(v) = m-(v) = E .
Ví dụ:
- Xét đồ thị vơ hướng Hình 1.3.a ta có:
m(G) = m(A) + m(B) + m(C) + m(D) = 2 + 5 + 2 + 1 = 10
- Xét đồ thị có hướng Hình 2.1 ta có:
m(G) = [m+(A) + m+(B) + m+(C) ] + [m-(A) + m-(B) + m-(C)]
= [1 + 2 + 1] + [2 + 1 +1] = 8
Định lý:
Cho đồ thị hữu hạn G = <V,E> khi đó bậc của đồ thị G bằng 2 lần số
cạnh của đồ thị, tức là m(G) = 2 E .
Chứng minh:

Ta thấy một cạnh thuộc 2 đỉnh, nếu xố một cạnh thì bậc của G giảm đi 2,
nếu xố một khun e = (u,u) thì bậc của G cũng giảm đi 2, cịn nếu xố hết
cạnh, hết khun thì bậc của đồ thị bằng 0. Từ đó suy ra định lý.

8


Hệ quả: Số đỉnh bậc lẻ của đồ thị G = <V,E> là một số chẵn.
Chứng minh:
Gọi A và B tương ứng là tập đỉnh bậc lẻ và tập đỉnh bậc chẵn của đồ thị. Ta có:

2m   m(v)   m(v)   m(v) .
vV

vA

vB

Do vế trái chẵn nên tổng vế phải cũng là số chẵn. Mà tổng bậc của các đỉnh
bậc chẵn (v  A) là số chẵn nên tổng bậc của các đỉnh bậc lẻ (v  B) phải là số
chẵn, do tất cả các số hạng của nó là số lẻ, nên tổng này phải gồm một số chẵn
các số hạng. Vì vậy số đỉnh bậc lẻ phải là số chẵn.
1.3.2. Đường đi và chu trình
a. Đường đi
Xét đồ thị G = <V,E> với
- Tập đỉnh V = {v1,v2,...,vn}
- Tập cạnh E = {e1,e2,...,em}.
Tập hợp các đỉnh kề nhau từ vi đến vj được gọi là 1 đường đi.
Kí hiệu:


vivi1vi2 ... vj  vieivi1ei1vi2ei2 ... ejvj,

trong đó các cạnh, các đỉnh trong đường đi có thể lặp lại.
Độ dài của đường đi bằng số các cạnh (hoặc cung) trong đường đi đó.
Chú ý trong đồ thị có hướng, trên một cung uv chẳng hạn thì đường đi chỉ có
thể đi từ gốc (u) đến ngọn (v) khơng thể đi ngược lại.
b. Chu trình
Xét một đường đi từ vi - vj. Nếu vi  vj thì đường đi này được gọi là một
chu trình. Như vậy chu trình là một đường đi có đỉnh xuất phát và đỉnh kết thúc
trùng nhau.
Chú ý đường đi trong đồ thị có hướng khơng được đi ngược chiều mũi tên.

9


- Đường đi (chu trình) được gọi là đơn nếu nó đi qua mỗi cạnh khơng q một
lần.
- Đường đi (chu trình) được gọi là sơ cấp nếu nó đi qua mỗi đỉnh đúng một lần.
B

A

E

C

D
Hình 3.1

Ví dụ Hình 3.1 ADBE là một đường đi sơ cấp từ A đến E độ dài 3; ABCDBE là

đường đi không sơ cấp (qua B 2 lần) từ A đến E độ dài 5; ABDAB là một đường
đi không đơn (chứa cạnh AB 2 lần) từ A đến B độ dài 4; ABDA Là 1 chu trình
đơn và sơ cấp độ dài 3; CC là đường đi độ dài 0.
Xét đồ thị có hướng Hình 2.1 thì ABCB là một đường đi độ dài 3; CBA
khơng là một đường đi vì khơng có cung đi từ B đến A.
Định lý:
Nếu trong đồ thị G = <V,E> các đỉnh đều có bậc khơng nhỏ hơn 2
(v  V | m(v)  2) thì trong G tồn tại ít nhất một chu trình.

Chứng minh:
Xét tất cả các đường đi đơn. Vì đồ thị là hữu hạn cho nên số các đường đi
đơn là hữu hạn. Chọn một đường đi là dài nhất nào đó ví dụ từ v i1 đến vij +1 (xem
hình vẽ dưới đây). Theo giả thiết m(v)  2 nên tồn tại ít nhất một đỉnh vi0 và một
cạnh nối đỉnh vi1 và vi0. Đỉnh vi0 thuộc một trong các đỉnh trên đường đi đã chọn
chẳng hạn vij, vì đường đi là dài nhất nên chứng tỏ tồn tại một chu trình trong
đường đi.

10


Vi1

Vi2

VA
ij

Vi3

Vij+1


Vi0

1.3.3. Đồ thị liên thông
Cho đồ thị G = <V,E>. Hai đỉnh phân biệt u,v  V được gọi là liên thông
nếu tồn tại một đường đi nối các đỉnh u,v với nhau. Đồ thị G được gọi là liên
thông nếu với hai đỉnh phân biệt bất kỳ trong đồ thị đều là liên thơng.
Hình 3.1 là một đồ thị liên thơng vì ln có đường đi nối hai đỉnh bất kỳ của đồ
thị.
Xét 2 đồ thị liên thông
G1 = <V1, E1> và G2 = <V2, E2>,
trong đó:

V1  V2 = 

Khi đó:

và E1  E2 =  .

V = V1  V2
E = E1  E2,

thì G = <V,E> là đồ thị có 2 thành phần liên thơng G1, G2.

A

B

D


C

F

Hình 3.3

11

E


Đồ thị Hình 3.3 có ba thành phần liên thơng sau:
G1 = <V1, E1> với V1= {A,B,C} và E1 = {AB, AC, CB}.
G2 = <V2, E2> với V2= {D, E} và E2 = {DE}.
G3 = <V3, E3> với V3= {F} và E3 =  .
Cho đồ thị có hướng G = <V,E>
- G được gọi là đồ thị liên thông yếu nếu đồ thị vơ hướng tương ứng với nó là
liên thông.
- G là liên thông một chiều nếu với hai đỉnh u,v khác nhau bất kỳ của G luôn có
đường đi u - v hoặc đường đi v - u.
- G là liên thông mạnh (liên thông 2 chiều) nếu hai đỉnh u,v khác nhau bất kỳ của
G đều có đường đi u - v và đường đi v - u.

A

B
D

A


B
D

A

B
D

C

C

C

H1

H2

H3

Hình 3.4
Hình 3.4 đồ thị H1 là liên thơng mạnh, giả sử cặp đỉnh (A,C) ta có chiều
đi từ C tới A, và đồng thời cũng có chiều đi từ A tới C, và bất kỳ các cặp đỉnh
khác cũng tương tự như vậy. H2 là liên thông một chiều vì xét cặp đỉnh (A,D) có
chiều đi từ D tới A nhưng khơng có chiều đi từ A tới D. H 3 là liên thơng yếu vì

12


tồn tại cặp đỉnh (B,C) khơng có chiều đi B - C cũng khơng có chiều đi C - B,

nhưng đồ thị vô hướng tương ứng là liên thông.
1.3.4. Đồ thị con và đồ thị bộ phận
Cho đồ thị G = <V,E>.
- Nếu trong đồ thị đó ta bỏ đi một số đỉnh nào đó và các cạnh xuất phát từ đỉnh
đó thì phần cịn lại của đồ thị được gọi là đồ thị con của đồ thị G đã cho, hoặc
nếu D = <V',E'> là đồ thị con của G = <V,E> thì V'  V và E'  E.
- Nếu trong đồ thị G ta bỏ đi một số cạnh nhưng giữ ngun các đỉnh thì phần
cịn lại của đồ thị được gọi là đồ thị bộ phận của đồ thị G.
1.4. Các dạng biểu diễn của đồ thị
1.4.1. Biểu diễn hình học của đồ thị
Để có cái nhìn trực quan ta thường biểu diễn đồ thị bằng hình học, một đồ
thị có thể biểu diễn trên một mặt phẳng hoặc trong không gian. Phương pháp
biểu diễn như sau: Biểu diễn các đỉnh của đồ thị bằng các điểm (hay vịng trịn
nhỏ, ơ vng nhỏ) và nối hai điểm bằng một đường (cong, thẳng, mũi tên) khi
cặp điểm đó ứng với một cạnh (cung) của đồ thị.
Ví dụ 1: Cho đồ thị G = <V,E> trong đó
V = {A, B, C, D, E}
C



E = {AB, AC, AD, AE, BD, CD, CE}

D

A

B

E

B

D

E
A

C

a)

b)
Hình 4.1

Hình 4.1.a và Hình 4.1.b đều là biểu diễn hình học của đồ thị G đã cho ở trên
13


1.4.2. Sự đẳng cấu
Với mỗi đồ thị thì có thể có nhiều dạng biểu diễn hình học, có nhiều đồ thị
tưởng chừng khác nhau nhưng đó là cách biểu diễn hình học khác nhau của cùng
một đồ thị, sự đẳng cấu cho phép chúng ta kết luận được điều đó.
Định nghĩa: Xét 2 đồ thị G1 = (V1, E1) và G2 = <V2, E2>.
Hai đồ thị này được gọi là đẳng cấu với nhau nếu tồn tại 1 song ánh từ V1 vào V2
và từ E1 vào E2 sao cho nếu có cạnh e = (u, v)  E1 tương ứng với cạnh e' = (u',
v')  E2 thì cặp đỉnh u, v  V1 cũng là tương ứng cặp đỉnh u', v'  V2
Ví dụ xét 2 đồ thị G1 và G2 Hình 4.2
a

b


d

c

m

n

q

G1

p

G2
Hình 4.2

Ta có f : G1 -> G2
f(a) = m

f(c) = n

f(d) = q

f(b) = p.

Nếu a, b  V1 kề nhau thì f(a), f(b)  V2 kề nhau.
Vậy đây là 2 đồ thị đẳng cấu với nhau, ta có thể xem G1 và G2 thực chất chỉ là 1
chỉ có điều biểu diễn ở dạng hình học khác nhau, các tên đỉnh khác nhau.

Với 2 đồ thị đẳng cấu thì chúng có những tính chất bất biến như sau:
- Số đỉnh bằng nhau
- Số cạnh bằng nhau
- Bậc các đỉnh tương ứng cùng như nhau
- 2 Ma trận kề cũng như nhau
- Các chu trình cũng như nhau

14


1.4.3. Một số đồ thị đặc biệt
Do tính chất, dạng biểu diễn có những nét đặc thù riêng biệt nên ta phân
loại một số đồ thị thành các dạng đặc biệt sau:
a. Đồ thị đều
Là một đồ thị mà mọi đỉnh có cùng bậc, nếu bậc này bằng k thì đó là đồ
thị k đều.

a)

b)

Hình 4.3 a: G- 1 đều;

c)

b: G - 2 đều;

d)

c: G - 2 đều;


d: G - 3 đều.

Trường hợp riêng như đồ thị Hình 4.3.b và Hình 4.3.c là những đồ thị vịng ký
hiệu Cn (n là số đỉnh).
b. Đồ thị đầy đủ
Đồ thị đầy đủ n đỉnh, ký hiệu Kn là đơn đồ thị vô hướng mà mọi cặp đỉnh
phân biệt ln kề nhau. Hình 4.4 dưới đây hoặc 1 trường hợp riêng của đồ thị
đều G - 3 là những đồ thị đầy đủ.

a)

b)

Hình 4.4 a - đồ thị đầy đủ K2 ;

15

b - đồ thị đầy đủ K4


c. Đồ thị bánh xe
Ký hiệu Wn, thu được từ đồ thị vịng có n đỉnh bằng cách bổ sung một đỉnh
mới nối tất cả các đỉnh đã có.

W4

W5

W6


Hình 4.5 Các dạng đồ thị bánh xe
d. Một vài ứng dụng của đồ thị đặc biệt
Ở các mạng cục bộ (LAN), các máy tính thường được kết nối theo một
cách thức nào đó gọi là hình trạng (topolopy). Dựa theo đặc điểm của các
topolopy này mà ta có thể mơ hình bằng 1 số dạng đồ thị đặc biệt. Ví dụ với
mạng LAN các máy tính được kết nối theo topolopy hình sao (Star) sau đây:

Hình 4.6
Dạng này, tất cả các máy được nối vào một thiết bị trung tâm có nhiệm vụ
nhận tín hiệu từ các máy và chuyển đến máy đích của tín hiệu. Từ đặc điểm này
có thể mơ hình bằng một đồ thị bộ phận của đồ thị bánh xe W6 (Hình 4.7.a).

16


a)
a) Dạng sao

b)

c)

d)

b) dạng vòng c) dạng hỗn hợp d) dạng đầy đủ (Complete)
Hình 4.7 Một số topolopy của LAN

Ở mạng LAN ta cũng thường có các dạng topolopy khác như dạng chu
trình (loop) hoặc gọi là vịng. Ở dạng này mỗi máy nối đúng với 2 máy khác.

Mạng cục bộ với cấu trúc vịng trịn được mơ hình bằng các đồ thị đặc biệt dạng
vịng Cn (Hình 4.7.b), thơng báo gửi từ máy này sang máy khác theo chu trình
vịng trịn cho tới khi tới được máy đích. Hoặc 1 dạng nữa là dạng hỗn hợp, đó là
sự kết hợp của dạng hình sao và hình vịng. Topolopy kiểu này là một đồ thị
bánh xe Wn (Hình 4.7.c). Mạng cục bộ dạng bánh xe các máy có thể truyền vịng
quanh theo vịng trịn hoặc có thể qua bộ phận trung tâm. Ngồi ra người ta cũng
thường hay bố trí mạng sao cho các máy đều kết nối trực tiếp với nhau, với kiểu
này có thể mơ hình bằng đồ thị đầy đủ Kn (Hình 4.7.d).
1.4.4. Biểu diễn đồ thị trên máy tính
Lĩnh vực đồ thị có nhiều ứng dụng trong thực tế, có thể mơ hình nhiều ứng
dụng bằng đồ thị và sử dụng máy tính để giải quyết các bài tốn về ứng dụng đó.
Nên việc biểu diễn và lưu trữ đồ thị trên máy tính là một vấn đề khá trọng tâm,
phương thức biểu diễn từng loại đồ thị trên máy tính ảnh hưởng đến các giải
thuật, phương pháp giải quyết các ứng dụng trên máy tính.
a. Biểu diễn bằng ma trận kề
Phương pháp này dựa trên mối quan hệ giữa các cặp đỉnh, mỗi đồ thị được
đặt tương ứng với một ma trận vuông cấp n (n là số đỉnh của đồ thị). Gọi ma trận
kề là A = (aij ) i,j = 1...n.
17


+ Trường hợp G = <V,E> là đồ thị vô hướng với V = {v 1, v2,...,vn} khi đó mỗi
phần tử aij của ma trận A được xác định như sau: aij = aji = d, nếu cặp đỉnh (vi, vj)
có d cạnh nối với nhau. Khi cặp đỉnh (vi, vj) khơng có cạnh nào nối với nhau thì
aij = 0. Ta thấy ma trận kề của đồ thị vô hướng là ma trận đối xứng.
+ Trường hợp G = <V,E> là đồ thị có hướng với V = {v1, v2,...,vn} thì mỗi phần
tử aij của A được xác định như sau: đối với mỗi cặp đỉnh (vi, vj) từ vi đến vj nếu
có d cung thì aij = d. Chú ý aji = 0 nếu khơng có cung nào hướng từ v j đến vi. Ma
trận kề trong trường hợp này là không đối xứng.
Trong 2 trường hợp trên ta chú ý nếu đỉnh v i có một khuyên thì phần tử tương

ứng của ma trận kề là aii = 1

A

B

B

A

D

C

C

G1

G2
Hình 4.8

Ta có thể dựng ma trận kề biểu diễn đồ thị G1 và G2 trong Hình 4.8 như sau:

M G1

1

1

1


0


1 1 0 

0 2 1
2 0 0

1 0 0 

M G2

0 1 1 


 0 1 0
1 1 0 



Đối với đồ thị có trọng số mỗi cạnh e = (v i, vj) được gán một trọng số l(e)
(hoặc l(vi, vj) ) thì ma trận kề của nó được thay bằng ma trận có trọng số, khi đó
mỗi phần tử của ma trận bằng trọng số của cạnh tương ứng: aij =l(vi, vj).
18


Ưu điểm của phương pháp này là dễ dàng xác định được các cặp đỉnh có
kề nhau hay khơng hoặc rất thuận tiện khi tìm số bậc của mỗi đỉnh. Việc truy cập
phần tử của ma trận kề qua chỉ số không phụ thuộc vào số đỉnh của đồ thị.

Nhược điểm lớn nhất của phương pháp này là không phụ thuộc vào số
cạnh của đồ thị, ta luôn phải sử dụng n2 đơn vị bộ nhớ để lưu trữ ma trận kề của
nó.
b.Biểu diễn bằng danh sách cạnh (cung)
Cho đồ thị G = <V,E> với số cạnh m, số đỉnh n. Nếu m < 6n thì G thường
được biểu diễn dưới dạng danh sách cạnh (cung).
Theo cách này danh sách tất cả các cạnh (cung) của đồ thị vô hướng (có hướng).
Mỗi cạnh (cung) e = (u,v) của đồ thị tương ứng với hai biến Dau[e], Cuoi[e].
1

2

4
G1

1

3
3
3
3

2

4

3
G2
Hình 4.9


Hình 4.9 đồ thị G1 và G2 được biểu diễn bằng danh sách cạnh (cung) như sau:
Đầu Cuối
1
2
1
3
2
3
2
4
3
4
Danh sách cạnh G1

Đầu Cuối
1
2
2
3
3
1
4
1
4
2
Danh sách cung G2
Vậy để lưu trữ đồ thị cần sử dụng 2m đơn vị bộ nhớ. Nhược điểm của phương
pháp này là để xác định những đỉnh nào của đồ thị là kề với một đỉnh cho trước
chúng ta phải làm m phép so sánh.
19



c. Danh sách kề
Phương pháp biểu diễn bằng danh sách kề cũng được sử dụng khá phổ biến
và thường hay dùng cho đồ thị có hướng.
Danh sách kề cho đỉnh vi là danh sách gồm tất cả các đỉnh kề của vi theo thứ
tự các đỉnh trong tập đỉnh V. Ta có thể biểu diễn đồ thị như một mảng FIRST,
với phần tử FIRST[i] là con trỏ trỏ tới danh sách kề cho đỉnh vi.
Hình 4.9 đồ thị G1 và G2 được biểu diễn bằng danh sách kề như sau:
FIRST
1

2

3

Nil

2

1

3

4

Nil

31


1

2

4

Nil

1

2

3

Nil

Danh sách kề của đồ thị G1
FIRST
1
4
2
3

2

Nil

3

Nil


1

Nil

4

2

3

Nil

Danh sách kề đồ thị G2
Bộ nhớ sử dụng cho phương pháp biểu diễn danh sách kề là tỷ lệ thuận với
tổng số đỉnh và các cạnh của đồ thị.

20


CHƢƠNG 2
BÀI TỐN TÌM ĐƢỜNG ĐI NGẮN NHẤT
2.1 Giới thiệu bài toán
Trong thực tế chẳng hạn trong mạng lưới giao thông đường bộ, đường
thuỷ hoặc đường không, người ta không chỉ quan tâm đến việc tìm đường đi giữa
2 địa điểm mà cịn phải lựa chọn một hành trình tiết kiệm nhất (theo tiêu chuẩn
thời gian, không gian hay chi phí). Khi đó phát sinh u cầu tìm đường đi ngắn
nhất giữa 2 đỉnh của đồ thị. Bài tốn đó phát biểu dưới dạng tổng quát như sau:
Cho đồ thị có trọng số G=(V,E), hãy tìm một đường đi ngắn nhất xuất phát từ
đỉnh xuất phát S  V đến đỉnh đích f  V , độ dài của đường đi này sẽ kí hiệu là:

d s, f  là khoảng cách từ s đến f. Nếu như không tồn tại khoảng cách từ s đến f

thì ta kí hiệu khoảng cách đó là=   .
Dưới đây ta xét một số thuật tốn để tìm đường đi ngắn nhất trong đồ thị
có trọng số.
2.2. ĐƢỜNG ĐI NGẮN NHẤT TRONG ĐỒ THỊ CÓ TRỌNG SỐ
a. Khái niệm
Cho đồ thị hữu hạn G = <V,E> với mỗi cạnh e  E ta đặt tương ứng với
số dương w(e) là trọng số của e. Gọi là đồ thị có trọng số.
Gọi a là một đường đi nào đó trong G = <V,E>.
Giả sử a = vi1ei1vi2ei2 ... vin – 1ein-1vin, vij  V , e ij  E (j = 1, 2, ...,n).
n1

Khi đó ký hiệu

w( )   w(eij ) gọi là trọng số của đường a.
j

ký hiệu D(a,b) là tập tất cả các đường đi nối đỉnh a với đỉnh b trong đồ thị
G. Đường đi a giữa a và b là ngắn nhất nếu a thoả mãn w(a) = min {w(b) / b 
D(a,b)}.
21


b. Bài toán: Cho đơn đồ thị G = <V, E> liên thơng có trọng số, và a, b  V. Tìm
các đường đi ngắn nhất giữa 2 đỉnh a, b.
Cơ sở thuật tốn tìm đường đi ngắn nhất:
Gọi cu, v là trọng số của cạnh u, v. Quy ước cv, v  0 với mọi v  V và
cu, v   nếu như


u, v E . Đặt d s, v là khoảng cách từ s tới v. Để tìm đường

đi từ s tới f, ta có thể nhận thấy rằng luôn tồn tại đỉnh f1  f sao cho:
d s, f   d s, f1   c f1 , f 

(Độ dài đường đi ngắn nhất s  f bằng độ dài đường đi ngắn nhất s  f1 cộng
chi phí từ f1  f ).
Đỉnh f1 là đỉnh liền trước f trong đường đi ngắn nhất từ s tới f. Nếu
f1  s thì đường đi ngắn nhất là dường đi trực tiếp theo cung (s,f). Nếu khơng thì

vấn đề trở thành tìm đường đi ngắn nhất từ s tới f1 và ta lại tìm được một đỉnh f2
khác f và f1 để:
d s, f1   d s, f 2   c f 2 , f1 

Tiếp tục như vậy sau một số hữu hạn bước ta suy ra dãy f,f 1,f2,.. không
chứa đỉnh lặp lại và kết thúc ở s. Đường đi ngắn nhất sẽ được lấy theo thứ tự
ngược lại từ s tới f. Khi lập trình phải sử dụng lưu vết đường đi ngay trong quá
trình tìm kiếm.
Dưới đây ta sẽ xét 1 số thuật tốn tìm đường đi ngắn nhất từ đỉnh s tới
đỉnh f trên đơn đồ thị có hướng G=(V,E) có n đỉnh và m cung. Trong trường hợp
đơn đồ thị vơ hướng, bài tốn tìm đường đi ngắn nhất có thể dẫn về bài tốn trên
đồ thị có hướng bằng cách thay đổi mỗi cạnh của nó bằng hai cung có hướng
ngược chiều nhau. Các thuật tốn dưới đây sẽ ln tìm được đường đi ngắn nhất.

22


2.2.1. Thuật tốn FORD-BELLMAN
a. Thuật tốn:
Cho đồ thị có hướng được lưu vào một tệp văn bản dưới đây

Input: File văn bản
 Dòng 1: Chứa số đỉnh (n<=100), số cung m của đồ thị, đỉnh xuất phát(f)
 m dòng tiếp theo mỗi dịng có 3 dạng số u,v,c[u,v] cách nhau ít nhất 1 dấu
cách thể hiện (u,v) là một cung thuộc E và trong số của cung đó là c[u,v].
Bước 1: Khởi tạo
d[v]:=c[u,v] { d[v]: khoảng cách ngắn nhất từ f tới v}
Bước 2: Xác định đường đi ngắn nhất
For u:=1 to n do
For v:=1 to n do
d[v]:= min(d[v], d[u]+c[u,v])
b. Nhận xét về Tính đúng của thuật tốn
Tại bước khởi tạo thì mỗi d[v] chính là độ dài ngắn nhất của đường đi từ S
tới v qua không quá 0 cạnh.Giả sử khi bắt đầu bước lặp thứ i ( i  1), d[v] đã bằng
độ dài đường đi ngắn nhất từ S tới v qua không quá i-1 cạnh. Bởi đường đi từ S
tới v qua không quá i cạnh sẽ phải thành lập bằng cách: Lấy một đường đi từ S
tới 1 đỉnh u nào đó qua khơng quá i-1 cạnh rồi đi tiếp tới v bằng cung (u,v), nên
độ dài đường đi ngắn nhất từ S tới v qua khơng q i cạnh sẽ được tính bằng giá
trị nhỏ nhất trong các giá trị.
 Độ dài đường đi ngắn nhất từ S tới v qua không quá i-1 cạnh .
 Độ dài đường đi ngắn nhất từ S tới u qua không quá i-1 cạnh cộng với số
cạnh (u,v) ( u ).

23


Vì vậy sau bước lặp tối ưu các d[v] được tính bằng cơng thức:
d[v]bước i =min(d[v] bước i-1,d[u] bước i-1 +c[u,v] ) (u) ,
các d[v] sẽ bằng độ dài đường đi ngắn nhất từ S tới v qua không quá i cạnh .
Sau bước lặp thứ n-1, ta có d[v]=độ dài đường đi ngắn nhất từ S tới v qua
không q n-1 cạnh . Vì đồ thị khơng có chu trình âm nên sẽ có 1 đường đi ngắn

nhất từ S tới v là đường đi cơ bản (qua không quá n-1 cạnh). Tức là d[v] sẽ là
đường đi ngắn nhất từ S tới v
Vậy số bước lặp tối ưu hố sẽ khơng q n-1 bước
Sự tối ưu bắc cầu (dùng d[u] tối ưu d[v] rồi lại có thể dùng d[v] để tối ưu
d[w] nữa …). Nó chỉ làm cho tốc độ tối ưu các nhãn d[v] tăng nhanh hơn nên số
bước lặp vẫn sẽ không quá n-1 bước.
Output: File văn bản ghi đường đi ngắn nhất từ đỉnh xuất phát tới các đỉnh còn
lại trong đồ thị và độ dài đường đi đó.
c. Chương trình
program thuat_toan_Ford_bellman;
uses crt;
const
max=100;
maxc=10000;
var
c:array[1..max,1..max] of integer;
d,a:array[1..max] of integer;
trace:array[1..max] of integer;
n,s,f,i,j:integer;
procedure nhapdothi;
var

24


fi:text;
i,m:integer;
u,v:integer;
begin
assign(fi,'bellman.inp'); reset(fi);

readln(fi,n,m,s);
for u:=1 to n do
for v:=1 to n do
if u=v then c[u,v]:=0
else
c[u,v]:=maxc;
for i:=1 to m do
readln(fi,u,v,c[u,v]);
close(fi);
end;
procedure khoitao;
var
i:integer;
begin
for i:=1 to n do
begin
d[i]:=c[s,i];
trace[i]:=s;
end;
end;
procedure Ford_Bellman;
var
stop:boolean;
u,v,coutloop:integer;

25


×