Đồ 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ử X là tập hữu hạn, không rỗng các phần tử nào đó và U Í X´X. Bộ G = <X, U> được gọi là đồ thị hữu hạn. Mỗi phần tử xẻX gọi là một đỉnh và mỗi phần tử u = (x,y) ẻ U gọi là một cạnh của đồ thị G = <X, U>.
Xét một cạnh u ẻ U khi đó tồn tại 2 đỉnh x, y ẻ X sao cho u = (x, y), ta nói rằng x nối với y hoặc x và y thuộc u.
15 trang |
Chia sẻ: luyenbuizn | Lượt xem: 1123 | Lượt tải: 0
Nội dung tài liệu Luận văn Một số vấn đề ứng dụng của đồ thị trong tin học, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 1
một số vấn đề cơ bản của đồ thị
I. Các định nghĩa đồ thị
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ử X là tập hữu hạn, không rỗng các phần tử nào đó và U Í X´X. Bộ G = được gọi là đồ thị hữu hạn. Mỗi phần tử xẻX gọi là một đỉnh và mỗi phần tử u = (x,y) ẻ U gọi là một cạnh của đồ thị G = .
Xét một cạnh u ẻ U khi đó tồn tại 2 đỉnh x, y ẻ X sao cho u = (x, y), ta nói rằng x nối với y hoặc x và y thuộc u.
x
y
u
- Nếu cạnh u = (x, y) mà x và y là hai đỉnh phân biệt thì ta nói x, y là hai đỉnh kề nhau.
- Nếu u = (x, x) thì u là cạnh có hai đỉnh trùng nhau ta gọi đó là một khuyên.
- Nếu u = (x, y) mà x,y là cặp đỉnh có phân biệt thứ tự hay có hướng từ x đến y thì u là một cung, khi đó x là gốc còn y là ngọn hoặc x là đỉnh ra, y là đỉnh vào.
- Khi giữa cặp đỉnh (x, y) 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
y
x
y
x
y
a) b) c)
a. Tại đỉnh y có một khuyên b. Một cung có hướng từ x sang y
c. Cặp đỉnh (x, y) 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 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ị
2. Đồ thị đơn
Đồ thị G = đượ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ó khuyên.
Hình 1.2 là một ví dụ về đồ thị đơn
3. Đa đồ thị
Đồ thị G = đượ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.
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.
A
B
C
D
A
B
C
D
a) b)
Hình 1.3 a. Đa đồ thị b. Giả đồ thị
II. Các loại đồ thị
1. Đồ thị vô hướng
Đồ thị G= được gọi là đồ thị vô hướng nếu tất cả các cạnh e ẻ U mà cặp đỉnh thuộc nó e = (x,y) ẻ X 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.
Ví dụ: như hình 1.3.a là biểu diễn của một đồ thị vô hướng.
2. Đồ thị có hướng
Đồ thị G = được gọi là đồ thị có hướng nếu tất cả các cạnh e ẻ U mà cặp đỉnh thuộc nó e = (x, y) ẻ X có phân biệt thứ tự. Đồ thị có hướng là đồ thị mà mọi e = (x, y) ẻ X đều là cung.
A
B
C
Hình 2.1 Đồ thị có hướng
3. Đồ thị hỗn hợp
Đồ thị G= 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.
Chú ý rằng 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.
III. Một số khái niệm và tính chất cơ bản của đồ thị
1. Bậc đồ thị
1.1 Bậc đồ thị vô hướng
Cho đồ thị vô hướng G = . Xét 1 đỉnh x ẻ X đặt m(x) là số cạnh thuộc đỉnh x khi đó m(x) được gọi là bậc của đỉnh x. Nếu x có một khuyên thì m(x) được cộng thêm 2.
x
x
m(x) = 3 m(x) = 2
- Nếu m(x) = 0 thì đỉnh x được gọi là đỉnh cô lập
- Nếu m(x) = 1 thì đỉnh x được gọi là đỉnh treo
Ta đặt
thì m(G) được gọi là bậc của đồ thị vô hướng G =
1.2 Bậc đồ thị có hướng
Cho đồ thị có hướng G= xét 1 đỉnh x ẻ X, ta ký hiệu m+(x) là số các cung vào của đỉnh x, còn m-(x) là số các cung ra khỏi x. Khi đó ta gọi m+(x) là bậc vào của đỉnh x còn m-(x) là bậc ra của đỉnh x.
- Nếu m+(x) + m-(x) = 0 thì đỉnh x được gọi đỉnh là cô lập
- Nếu m+(x) + m-(x) = 1 thì đỉnh x được gọi là đỉnh treo
Ta đặt
Khi đó m(G) được gọi là bậc của đồ thị có hướng G = .
Trong đồ thị có hướng thì m+(x) = m-(x) = ỗU ỗ
Ví dụ:
- Xét đồ thị vô hướng như trong 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 trong 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 = khi đó bậc của đồ thị G bằng 2 lần số cạnh của đồ thị, tức là m(G) = 2ỗU ỗ.
Chứng minh:
Ta thấy một cạnh thuộc 2 đỉnh, nếu xoá một cạnh thì bậc của G giảm đi 2, nếu xoá một khuyên u = (x, x) thì bậc của G cũng giảm đi 2, còn nếu xoá hết cạnh, hết khuyên thì bậc của đồ thị bằng 0. Từ đó suy ra định lý.
Hệ quả: Số đỉnh bậc lẻ của đồ thị G = 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ó:
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 (xẻA) là số chẵn nên tổng bậc của các đỉnh bậc lẻ (xẻ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.
2. đường đi và chu trình
2.1 Đường đi
Xét đồ thị G = với
- Tập đỉnh X = {x1,x2,...,xn}
- Tập cạnh U = {u1,u2,...,um}
Tập hợp các đỉnh kề nhau từ xi đến xj được gọi là 1 đường đi, kí hiệu
xixi1xi2 ... xj º xiuixi1ui1xi2ui2 ... ujxj
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ú ý rằng 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.
2.2 Chu trình
Xét một đường đi từ xi - xj. Nếu xi º xj 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ú ý rằng đường đi trong đồ thị có hướng không được đi ngược chiều mũi tên
- Đường đi (chu trình) được gọi là đơn nếu nó đi qua mỗi cạnh không quá 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
A
B
C
D
E
Hình 3.1
Ví dụ như ở 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 như 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 = các đỉnh đều có bậc không nhỏ hơn 2 ( "x ẻ X | m(x) ³ 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ừ xi1 đến xij +1 (xem hình vẽ dưới đây). Theo giả thiết m(x) ³ 2 nên tồn tại ít nhất một đỉnh xi0 và một cạnh nối đỉnh xi1 và xi0. Đỉnh xi0 thuộc một trong các đỉnh trên đường đi đã chọn chẳng hạn xij 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.
xi0
xi1
xi2
xi3
xij
xij+1
3. Đồ thị liên thông
Cho đồ thị G = . Hai đỉnh phân biệt x,y ẻ X được gọi là liên thông nếu tồn tại một đường đi nối các đỉnh x, y 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.
Ví dụ như hình 3.1 là một đồ thị liên thông vì luôn có đường đi nối hai đỉnh bất kỳ của đồ thị, còn đồ thị như hình 3.2 là không liên thông vì không có đường đi từ A tới D hoặc từ D tới F v.v..
Xét 2 đồ thị liên thông
G1 = và G2 =
Trong đó: X1 ầ X2 = ặ
và U1 ầ U2 = ặ
Khi đó: X = X1 ẩ X2
U = U1 ẩ U2
Thì G = là đồ thị có 2 thành phần liên thông G1, G2.
A
B
F
C
E
D
Hình 3.3
Ví dụ như đồ thị trong hình 3.3 có ba thành phần liên thông sau:
G1 = với X1= {A,B,C} và U1 = {AB, AC, CB}
G2 = với X2= {D, E} và U2 = {DE}
G3 = với X3= {F} và U3 = ặ
Cho đồ thị có hướng G =
- 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 x,y khác nhau bất kỳ của G luôn có đường đi x - y hoặc đường đi y - x.
- G là liên thông mạnh (liên thông 2 chiều) nếu hai đỉnh x,y khác nhau bất kỳ của G đều có đường đi x - y và đường đi y - x.
A
B
C
D
A
B
C
D
A
B
C
D
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. H3 là liên thông yếu vì 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.
4. Đồ thị con và đồ thị bộ phận
Cho đồ thị G =
- 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 là nếu D = là đồ thị con của G = thì X' Í X và U' Í U
- Nếu trong đồ thị G ta bỏ đi một số cạnh nhưng giữ nguyên 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.
IV. Các dạng biểu diễn của đồ thị
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ỏ, ô vuông 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 = trong đó
X = {A, B, C, D, E} và U = {AB, AC, AD, AE, BD, CD, CE}
C
D
E
B
A
A
B
D
E
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
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 = (X1, U1) và G2 =
Hai đồ thị này được gọi là đẳng cấu với nhau nếu tồn tại 1 song ánh từ X1 vào X2 và từ U1 vào U2 sao cho nếu có cạnh e = (u, v) ẻ U1 tương ứng với cạnh e' = (u', v') ẻ U2 thì cặp đỉnh u, v ẻ X1 cũng là tương ứng cặp đỉnh u', v' ẻ X2
Ví dụ xét 2 đồ thị G1 và G2 như hình 4.2
a
b
c
d
m
n
p
q
G1 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 ẻ X1 kề nhau thì f(a), f(b) ẻ X2 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.
Để xét 2 đồ thị có đẳng cấu không là việc khó, tuy nhiên để xét 2 đồ thị không đẳng cấu với nhau thì đơn giản hơn.
Đối với 2 đồ thị đẳng cấu thì các đồ thị đó 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
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:
3.1 Đồ 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) c) d)
Hình 4.3 a: G- 1 đều; b: G - 2 đều; 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)
3.2 Đồ thị đầy đủ
Đồ thị đầy đủ n đinh, ký hiệu Kn là đơn đồ thị vô hướng mà mọi cặp đỉnh phân biệt luôn kề nhau. Xem ví dụ như 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 ; b - đồ thị đầy đủ K4
3.3 Đồ 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
3.4 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 totolopy 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 như hình 4.7.a
a) b) c) d)
a) Dạng sao 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 như 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. Ngoà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)
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 toá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.
4.1 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.
+ Trường hợp G = là đồ thị vô hướng với X = {x1, x2,...,xn} 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 (xi, xj) có d cạnh nối với nhau. Khi cặp đỉnh (xi, xj) 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 = là đồ thị có hướng với X = {x1, x2,...,xn} thì mỗi phần tử aij của A được xác định như sau: đối với mỗi cặp đỉnh (xi, xj) từ xi đến xj nếu có d cung thì aij = d. Chú ý aji = 0 nếu không có cung nào hướng từ xj đến xi. 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 xi có một khuyên thì phần tử tương ứng của ma trận kề là aii = 1
A
C
B
D
A
B
C
D
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:
Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) được gán một trọng số l(e) (còn viết là l(xi, xj) ) 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(xi, xj)
Ư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ó.
Định lý:
s lần
Nếu G = là đa đồ thị với A = (aij) là ma trận kề tương ứng, thì số đường đi khác nhau từ đỉnh xi đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích A´A´...´A = As = (Pij)
Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi được mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật. Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đường truyền dự phòng giữa chúng không. Xét ở góc độ đồ thị thì cần kiểm tra xem số đường đi giữa cặp đỉnh tương ứng với 2 máy đó, nếu số đường đi lớn hơn 1 là đã có đường truyền dự phòng.
* Chương trình viết bằng PASCAL sau tính số đường đi độ dài l nhập từ bàn phím
Type MaTran = Array[1..20,1..20] Of Integer;
Var a, b, aa: MaTran;
n,l,x1,x2: Integer;
Procedure InputMt(Var Mt: Matran);
Var i, j: Integer;
Begin
For i:=1 to n do
For j:=1 to n do Begin
Write('a',i,j,'= '); Readln(Mt[i,j]);
End;
End;
Procedure Gan(Mt1: MaTran; Var Mt2: MaTran); {Mt2 <-- Mt1}
Var i,j:Integer;
Begin
For i:=1 to n do
For j:=1 to n do Mt2[i,j]:=Mt1[i,j];
End;
Procedure TichMt(mt1,mt2: Matran; Var MtKq: MaTran); { MtKq = Mt1*Mt2 }
Var i,j,k: Integer;
Begin
For i:=1 to n do
For j:=1 to n do Begin
MtKq[i,j]:=0;
For k:=1 to n do MtKq[i,j]:=MtKq[i,j]+Mt1[i,k]*Mt2[k,j];
End;
End;
Procedure LthuaMt(m: Integer); {aa = a ^m (m: do dai duong di, m>=2) }
Var i: Integer;
Begin
Gan(a,b);
For i:=1 to m-1 do Begin
TichMt(b,a,aa);
Gan(aa,b);
End;
End;
Procedure FindWay(i,j: Integer); { Tim so duong di tu dinh i-->j }
Begin
If aa[i,j]0 then
Writeln('So duong di do dai ',l,' tu x',x1,' --> ','x2 ','la: ',aa[i,j])
Else
Writeln('Khong co duong di tu dinh ',i,' toi dinh ',j,' voi do dai ',l);
End;
BEGIN
Writeln('Nhap ma tran ke cho do thi:');
Write('So dinh do thi: '); Readln(n);
InputMt(a);
Write('Dinh xuat phat: '); Readln(x1);
Write('Dinh ket thuc: '); Readln(x2);
Write('Do dai duong di: '); Readln(l);
LthuaMt(l);
FindWay(x1,x2);
END.
4.2 Danh sách cạnh (cung)
Cho đồ thị G = 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 = (x, y) của đồ thị tương ứng với hai biến Dau[e], Cuoi[e].
1
2
3
4
1
2
4
3
G1 G2
Hình 4.9
Dau Cuoi
1 2
1 3
2 3
2 4
3 4
Danh sách cạnh G1
Dau Cuoi
1 2
2 3
3 1
4 1
4 2
Danh sách cung G2
Ví dụ: Hình 4.9 đồ thị G1 và G2 được biểu diễn bằng danh sách cạnh (cung) như sau:
Như 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 cỡ m phép so sánh.
4.3 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 xi là danh sách gồm tất cả các đỉnh kề của xi theo thứ tự các đỉnh trong tập đỉnh X. 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 xi.
Ví dụ: ở hình 4.9 đồ thị G1 và G2 được biểu diễn bằng danh sách kề như sau:
FIRST
2
1
1
2
3 Nil
3
2
3 Nil
4 Nil
4 Nil
1
2
3
4
a) Danh sách kề của đồ thị G1
FIRST
3 Nil
2
1 Nil
3 Nil
2 Nil
1
2
3
4
b) 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ị.
Nhược điểm của cách biểu diễn này là thời gian cần thiết để xác định có một cạnh đi từ đỉnh xi tới đỉnh xj có hay không mất O(n). Cách biểu diễn này thích hợp cho các thuật toán mà cấu trúc đồ thị hay thay đổi như thêm hoặc bớt các cạnh.