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

Bài giảng môn toán rời rạc học phần 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 (1.19 MB, 92 trang )

MỤC LỤC

MỤC LỤC 1
Chƣơng 7. LÝ THUYẾT ĐỒ THỊ 3
7.1. MỞ ĐẦU 3
7.2. CÁC THUẬT NGỮ VỀ ĐỒ THỊ 6
7.2.1. Những thuật ngữ cơ sở 6
7.2.3. Những đồ thị đơn đặc biệt 7
7.2.4. Đồ thị phân đôi 8
7.2.5. Một vài ứng dụng của các đồ thị đặc biệt 9
7.2.6. Đồ thị con 11
7.3. BIỂU DIỄN ĐỒ THỊ VÀ SỰ ĐẲNG CẤU 11
7.3.1. Mở đầu 11
7.3.2. Biểu diễn đồ thị bằng danh sách liền kề 12
7.3.3. Ma trận liền kề, ma trận trọng số 12
7.3.4. Ma trận liên thuộc 13
7.3.5. Sự đẳng cấu của các đồ thị 13
7.4. TÍNH LIÊN THÔNG 14
7.4.1. Mở đầu 14
7.4.2. Đƣờng đi 14
7.4.3. Tính liên thông trong đồ thị vô hƣớng 16
7.4.4. Tính liên thông trong đồ thị có hƣớng 17
7.4.5. Đƣờng đi và sự đẳng cấu 18
7.4.6. Đếm đƣờng đi giữa các đỉnh 19
7.4.7. Phƣơng pháp duyệt đồ thị 20
7.5. ĐƢỜNG ĐI EULER VÀ ĐƢỜNG ĐI HAMILTON 25
7.5.1. Đƣờng đi và chu trình EULER 25
7.5.2. Đƣờng đi và chu trình Hamilton 34
7.6. BÀI TOÁN ĐƢỜNG ĐI NGẮN NHẤT 36
7.6.1. Mở đầu 36
7.6.2. Thuật toán Dijkstra xác định các đƣờng đi ngắn nhất từ một đỉnh đến các đỉnh còn lại


37
7.6.3. Thuật toán Floyd xác định đƣờng đi ngắn nhất giữa mọi cặp đỉnh 46
7.7. ĐỒ THỊ PHẲNG 47
7.7.1. Mở đầu 47
7.7.2. Công thức Euler 48
7.7.3. Định lý Kuratowski 51
7.8. TÔ MÀU ĐỒ THỊ 52
7.8.1. Mở đầu 52
7.8.2. Những ứng dụng của bài toán tô màu đồ thị 54
7.8.3. Thuật toán tô màu đồ thị đơn 55
Chƣơng 8. CÂY 56
8.1. MỞ ĐẦU 56
8.1.1. Cây nhƣ là các mô hình 58
8.1.2. Những tính chất của cây 59
8.2. CÁC ỨNG DỤNG CỦA CÂY 61
8.2.1. Mở đầu 61
8.2.2. Cây tìm kiếm nhị phân 61
8.2.3. Cây quyết định 62
8.2.4. Các mã tiền tố 63
8.3. CÁC PHƢƠNG PHÁP DUYỆT CÂY 64

2
8.3.1. Mở đầu8 64
8.3.2. Hệ địa chỉ phổ dụng 64
8.3.3. Các phƣơng pháp duyệt cây 64
8.3.4. Các ký pháp trung tố, tiền tố và hậu tố 66
8.4. CÂY KHUNG 67
8.4.1. Mở đầu 67
8.4.2. Những thuật toán xây dựng cây khung 68
8.4.3. Kỹ thuật quay lui 70

8.5. CÂY KHUNG NHỎ NHẤT 72
8.5.1. Mở đầu 72
8.5.2. Thuật toán tìm cây khung nhỏ nhất 72
BÀI TẬP 83
Chƣơng 7: Đồ thị 83
Chƣơng 8: CÂY 89
TÀI LIỆU THAM KHẢO 92

Chương7. Lý thuyết đồ thị
3
Chương 7. LÝ THUYẾT ĐỒ THỊ
Lý thuyết đồ thị là ngành khoa học đƣợc phát triển từ lâu nhƣng lại có nhiều ứng dụng hiện
đại. Những ý tƣởng cơ bản của nó đƣợc đƣa ra từ thế kỷ thứ 18 bởi nhà toán học Thụy Sĩ
tên là Leonard Euler. Ông đã dùng dồ thị để giải quyết bài toán cầu Konigsberg nổi tiếng.
Đồ thị đƣợc dùng để giải quyết nhiều bài toán khác nhau. Ví dụ dùng đồ thị để xác định xem
có thực hiện đƣợc một mạch điện trên một bảng điện phẳng không. Chúng ta cũng có thể phân
biệt hai hợp chất hóa học có cùng công thức phân tử nhƣng có cầu trúc khác nhau nhờ đồ thị.
Chúng ta cũng có thể xác định xem hai máy tính có đƣợc nối với nhau bằng một đƣờng truyền
thông hay không nếu dùng mô hình đồ thị mạng máy tính. Đồ thị với các trọng số đƣợc gán
cho các cạnh của nó có thể dùng để giải các bài toán nhƣ bài toán tìm đƣờng đi ngắn nhất giữa
hai thành phố trong một mạng giao thông. Chúng ta cũng có thể dùng đồ thị để lập lịch thi và
phân chia kênh cho các đài truyền hình.

7.1. MỞ ĐẦU
Đồ thị là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó. Ngƣời ta thƣờng
ký hiệu đồ thị G bằng = (V,E) , trong đó V là tập hợp các đỉnh (Vertex), E là tập hợp các
cạnh (Edge). Ngƣời ta phân loại đồ thị theo các đặc tính và số cạnh nối các cặp đỉnh của đồ
thị.
Các loại đồ thị
Giả sử một mạng máy tính gồm các máy tính và các đƣờng điện thoại. Ta có thể biểu diễn vị

trí của mỗi máy tính bằng một điểm và mỗi đƣờng điện thoại bằng một cung nhƣ trong hình
1.




Hình 7.1. Đơn đồ thị
Trong mạng máy tính này ta thấy có nhiều nhất một đƣờng điện thoại nối giữa 2 máy, mỗi
đƣờng điện thoại hoạt động cả hai chiều, và không có máy tính nào có đƣờng điện thoại dến
chính nó. Do vậy mạng này có thể mô hình bằng một một đơn đồ thị, bao gồm các đỉnh biểu
diễn các máy tính và các cạnh vô hƣớng biễu diễn các đƣờng điện thoại nối hai đỉnh phân
biệt và không có hai cạnh nối cùng một cặp đỉnh.
Định nghĩa 1. Một đơn đồ thị G = (V,E) gồm một tập không rỗng V mà các phần tử của
nó gọi là các đỉnh và một tập E mà các phần tử của nó gọi là các cạnh, đó là các cặp không
thứ tự của các đỉnh phân biệt.
Đôi khi có nhiều đƣờng điện thoại giữa các máy tính trong mạng. Đó là khi có sự truyền
thông với cƣờng độ cao giữa các máy tính. Mạng với nhiều đƣờng điện thoại đƣợc biểu diễn
trong hình sau. Đơn đồ thị không thể mô hình các mạng nhƣ thế này đƣợc. Thay vào đó ngƣời
ta dùng đa đồ thị. Đó là đồ thị gồm các đỉnh và các cạnh vô hƣớng, nhƣng có thể có nhiều
cạnh nối mỗi cặp đỉnh. Đơn đồ thị là một trƣờng hợp riêng của đa đồ thị. Ta không thể dùng
một cặp đỉnh để xác định một cạnh trong đa đồ thị.
Chương 7. Lý thuyết đồ thị

4
Định nghĩa 2. Một đa đồ thị G = (V,E) gồm một tập đỉnh V và một tập cạnh E và một
hàm f từ E tới { {u,v} | u,v V, uv}. Các cạnh e
1
và e
2
đƣợc gọi là song song hay cạnh

bội nếu f(e
1
) = f(e
2
).
Một mạng máy tính có thể có đƣờng điện thoại từ một máy tới chính nó (đƣờng nội bộ). Ta
không thể dùng da đồ thị để mô hình các mạng nhƣ thế đƣợc vì các đa đồ thị không chứa các
khuyên. Khi đó ta dùng một loại đồ thị tổng quát hơn là giả đồ thị.

Định nghĩa 3. Một giả đồ thị G = (V,E) gồm một tập đỉnh V và một tập cạnh E và một
hàm f từ E tới { {u,v} | u,v V, uv}. Một cạnh đƣợc gọi là một khuyên nếu f(e) = {u}.





Hình 7.2. Đa đồ thị
Có thể thấy rằng các cạnh bội trong một giả đồ thị gắn liền với cùng một cặp đỉnh. Tuy nhiên
ta nói rằng {u,v} là một cạnh của đồ thị G = (V,E) nếu có ít nhất một cạnh e sao cho f(e)
= {u,v}. Ta sẽ không phân biệt cạnh e và tập {u,v} tƣơng ứng với nó trừ khi đặc tính của
các cạnh bội là quan trọng.





Hình 7.3. Giả đồ thị
Tóm lại, giả đồ thị là loại đồ thị vô hƣớng tổng quát nhất vì nó có thể chứa các khuyên và các
cạnh bội. Đa đồ thị là loại đồ thị vô hướng có thể chứa cạnh bội nhưng không thể có các
khuyên, còn đơn đồ thị là loại đồ thị vô hướng không chứa cạnh bội hoặc các khuyên.

Các đƣờng điện thoại trong một mạng máy tính có thể hoạt động chỉ theo một chiều. Thí dụ
máy chủ ở New York có thể chỉ nhận dữ liệu từ các máy khác mà không thể gửi dữ liệu đi.
Khi đó các đƣờng điện thoại hai chiều đƣợc biểu diễn bằng một cặp cạnh có chiều ngƣợc
nhau.





Hình 8.4. Đơn đồ thị có hƣớng (có thể có khuyên nhƣng không có cạnh bội cùng chiều)
Chương 7. Lý thuyết đồ thị

5
Chúng ta dùng đồ thị có hƣớng để mô hình hóa những mạng mà chiều của đƣờng đi từ cạnh
này đến cạnh khác là quan trọng. Những cạnh của đồ thị có hƣớng là các cặp đỉnh có thứ tự.
Trong (đơn) đồ thị có hƣớng ngƣời ta dùng khuyên, tức là một cặp có thứ tự của cùng một
đỉnh, nhƣng không dùng cạnh bội cùng chiều nối cùng cặp đỉnh.
Định nghĩa 4. Một (đơn) đồ thị có hƣớng G = (V,E) gồm tập các đỉnh V và tập các cạnh
E là các cặp có thứ tự của các phần tử thuộc V.
Cuối cùng trong mạng máy tính có thể có nhiều đƣờngđiện thoại sao cho có thể có nhiều
đƣờng một chiều từ mỗi địa phƣơng đến máy chủ ở New York và có thể có nhiều đƣờng từ
máy chủ tới các máy ở xa. Trong trƣờng hợp này ta dùng đa đồ thị có hƣớng, trong dó có thể
có nhiều các cạnh có hƣớng từ một đỉnh tới một đỉnh khác (có thể tới chính nó).
Định nghĩa 5. Một đa đồ thị có hƣớng G = (V,E) gồm một tập đỉnh V và một tập cạnh E
và một hàm f từ E tới { (u,v) | u,v V, uv}. Các cạnh e
1
và e
2
đƣợc gọi là song song
hay cạnh bội nếu f(e

1
) = f(e
2
).(Trong định nghĩa này (u,v) là các cặp có thứ tự).
Có thể thấy rằng các cạnh bội trong một đa đồ thị có hƣớng gắn liền với cùng một cặp đỉnh.
Tuy nhiên ta nói rằng (u,v) là một cạnh của đồ thị G = (V,E) nếu có ít nhất một cạnh e
sao cho f(e) = (u,v). Ta sẽ không phân biệt cạnh e và cặp đỉnh có thứ tự (u,v) tƣơng ứng
với nó trừ khi đặc tính của các cạnh bội là quan trọng.

Loại đồ thị
Cạnh
Có cạnh bội không?
Có khuyên không?
Đơn đồ thị
Đa đồ thị
Giả đồ thị
Đồ thị có hƣớng
Đa đồ thị có hƣớng
Vô hƣớng
Vô hƣớng
Vô hƣớng
Có hƣớng
Có hƣớng
Không


Không

Không
Không





Chương 7. Lý thuyết đồ thị

6

7.2. CÁC THUẬT NGỮ VỀ ĐỒ THỊ
7.2.1. Những thuật ngữ cơ sở
Định nghĩa 1. Hai đỉnh u và v trong một đồ thị vô hƣớng đƣợc gọi là liền kề (láng giềng)
nếu {u,v} là một cạnh của G. Nếu e = {u,v} thì e đƣợc gọi là cạnh liên thuộc với các đỉnh
u và v. Cạnh e cũng đƣợc gọi là cạnh nối các đỉnh u và v. Các đỉnh u và v đƣợc gọi là
các điểm đầu mút của cạnh {u,v}.
Định nghĩa 2. Bậc của một đỉnh trong đồ thị vô hƣớng là số các cạnh liên thuộc với nó, riêng
khuyên tại một đỉnh đƣợc tính hai lần cho bậc của nó. Ngƣời ta ký hiệu bậc của đỉnh là
deg(v).
Đỉnh cô lập là đỉnh không nối với bất kỳ đỉnh nào.
Đỉnh treo là đỉnh có bậc bằng 1.
Định lý 1. Định lý bắt tay. Cho G = (V,E) là một đồ thị vô hƣớng có e cạnh. Khi đó 2e=

Vv
deg(v)
(Định lý này đúng cả khi đồ thị có cạnh bội hoặc các khuyên)
Định lý 1 chỉ ra rằng tổng các bậc của tất cả các đỉnh của một đồ thị vô hƣớng là một số chẵn.
Sự kiện đơn giản này có rất nhiều hệ quả hay, một trong số đó là Định lý 2.
Định lý 2. Trong một đồ thị vô hƣớng số các đỉnh bậc lẻ là một số chẵn.
Chứng minh. Giả sử V
1
và V

2
tƣơng ứng là tập các đỉnh bậc chẵn và bậc lẻ của đồ thị vô
hƣớng G = (V,E). Khi đó
2e=


1
Vv
deg(v) +


2
Vv
deg(v)
vì deg(v) là chẵn với mọi vV
1
, nên tổng đầu tiên là một số chẵn. Suy ra tổng thứ hai cũng
là một số chẵn. Tổng thứ hai có các thành phần đều là số lẻ, nên để tổng là số chẵn thì số
thành phần phải là một số chẵn.
Định nghĩa 3. Khi (u,v) là cạnh của đồ thị có hƣớng G, thì u đƣợc gọi là nối tới v, và v
đƣợc gọi là đƣợc nối từ u. Đỉnh u đƣợc gọi là đỉnh đầu, đỉnh v đƣợc gọi là đỉnh cuối của
cạnh (u,v). Đỉnh đầu và đỉnh cuối của khuyên là trùng nhau.
Vì các cạnh của đồ thị có hƣớng là các cặp có thứ tự, nên định nghĩa bậc của đỉnh cần phải
tinh hơn để phản ánh đƣợc số các cạnh nhận đỉnh này là đỉnh đầu ra (ra khỏi đỉnh này) và số
các cạnh nhận đỉnh này là đỉnh cuối (đi vào đỉnh này).
Định nghĩa 4. Trong đồ thị có hƣớng, bậc- vào của đỉnh v ký hiệu là deg
-
(v) là số các cạnh
có đỉnh cuối là v. Bậc- ra của đỉnh v ký hiệu là deg
+

(v) là số các cạnh có đỉnh đầu là v. (Nhƣ
vậy một khuyên tại một đỉnh sẽ góp thêm 1 đơn vị vào bậc vào và 1 đơn vị vào bậc ra của
đỉnh này).
Chương 7. Lý thuyết đồ thị

7

Ví dụ 3.
Vì mỗi cạnh (hay còn gọi là cung) có một đỉnh đầu và một đỉnh cuối nên tổng các bậc vào và
tổng các bậc ra của tất cả các đỉnh trong một đồ thị có hƣớng là nhƣ nhau và bằng số cạnh
của nó. Đó chính là nội dung của định lý sau
Định lý 3. Cho G = (V, E) là một đồ thị có hƣớng. Khi đó

Vv
deg
-
(v) =

Vv
deg
-
(v) = |E|
Một số tính chất của đồ thị có hƣớng không phụ thuộc vào hƣớng của các cạnh của nó. Do đó,
trong trƣờng hợp này ta bỏ qua hƣớng và nhận đƣợc đồ thị vô hƣớng. Đồ thị vô hƣớng nhận
đƣợc bằng cách này đƣợc gọi là đồ thị vô hƣớng nền. Đồ thị có hƣớng và đồ thị vô hƣớng
nền của nó có cùng số cạnh.
Định nghĩa 5. Đồ thị vô hƣớng G = (V,E)
đƣợc gọi là đồ thị đầy đủ, nếu mỗi cặp đỉnh
đều có cạnh nối giữa chúng.
Hình 8.5. Đồ thị vô hƣớng đầy đủ

Đồ thị có hƣớng G = (V,E) đƣợc gọi
là đồ thị đầy đủ, nếu mỗi cặp đỉnh đều
có cung nối giữa chúng (chiều của cung
có thể tùy ý).
Hình 8.6. Đồ thị có hƣớng đầy đủ

7.2.3. Những đồ thị đơn đặc biệt
Bây giờ chúng ta sẽ xét một vài lớp đồ thị đơn thƣờng gặp trong các ứng dụng.
Ví dụ 4. Đồ thị đầy đủ. Đồ thị đầy đủ n đỉnh, ký hiệu là K
n
là một đơn đồ thị chứa đúng
một cạnh nối mỗi cặp đỉnh phân biệt.


K
1
K
2
K
3
K
4

Hình 7.7. Đơn đồ thị vô hƣớng đầy đủ

Ví dụ 5. Chu trình (vòng). Chu trình , ký hiệu là C
n
, n 3, là một đơn đồ thị có n đỉnh
v
1

,v
2
, , v
n
và các cạnh là {v
1
,v
2
}, {v
2
,v
3
}, , {v
n-1
,v
n
},{v
n
,v
1
}



Chương 7. Lý thuyết đồ thị

8

C
3

C
4
C
5


Hình 7.8. Chu trình
Ví dụ 6. Đồ thị hình bánh xe. Khi thêm một đỉnh vào chu trình C
n
với n3 và nối đỉnh này
với mỗi một trong n đỉnh của C
n
bằng những cạnh mới, ta sẽ nhận đƣợc đồ thị hình bánh xe.




W
3
W
4
W
5
W
6


Hình 7.9. Đồ thị hình bánh xe



Ví dụ 7. Các khối n chiều.
Đồ thị khối 3 chiều Q
3


Hình 7.10. Khối n chiều

7.2.4. Đồ thị phân đôi
Đôi khi các đỉnh của đồ thị có thể chia làm 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.
Định nghĩa 5. Một đồ thị đơn G đƣợc gọi là đồ thị phân đôi nếu tập các đỉnh V có thể phân
làm hai tập con không rỗng, rời nhau V
1
và V
2
sao cho mỗi cạnh của đồ thị nối một đỉnh
của V
1
với một đỉnh của V
2
.




Hình 7.11. Đồ thị phân đôi
Định nghĩa 6. Một đồ thị đơn K
m,n
đƣợc gọi là đồ thị phân đôi đầy đủ nếu tập các đỉnh V
có thể phân làm hai tập con không rỗng, rời nhau V

1
có m đỉnh và V
2
có n đỉnh sao cho
có một cạnh giữa 2 đỉnh nếu và chỉ nếu một đỉnh thuộc V
1
và đỉnh thứ hai thuộc V
2
.
Ví dụ 11. Các đồ thị sau là các đồ thị phân đôi đầy đủ


Chương 7. Lý thuyết đồ thị

9


K
2,3
K
3,3

Hình 7.12. Đồ thị phân đôi đầy đủ

7.2.5. Một vài ứng dụng của các đồ thị đặc biệt
Bây giờ chúng ta sẽ chỉ ra cách dùng các loại đồ thị đặc biệt trong các mô hình truyền dữ liệu
và xử lý song song.
Ví dụ 12. Các mạng cục bộ (LAN).
Một số mạng cục bộ có 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ộ dạng này có thể biểu diễn bằng một đồ thị phân đôi đầy đủ

K
1,n
nhƣ hình 8.13.a.
Mạng cục bộ có thể có cấu trúc vòng tròn, trong đó mỗi thiết bị đƣợc nối với đúng hai thiết bị
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 chu trình C
n
nhƣ trên Hình
8.13.b. Thông báo gửi từ thiết bị này đến thiết bị khác đƣợc truyền đi theo vòng tròn cho tới
khi đến nơi nhận.
Cuối cùng, 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ộ với sự dƣ thừa này có thể mô hình hóa bằng
đồ thị hình bánh xe nhƣ Hình 8.13.c.



(a) (b)
(c)
Hình 8.13. Các dạng của mạng cục bộ

Ví dụ 13. Đồ thị trong việc thiết kế mạng kết nối các bộ vi xử lý trong tính toán song song.
Chương 7. Lý thuyết đồ thị

10
Cho tới gần đây, các máy tính chỉ thực hiện đƣợc các chƣơng trình có một phép toán tại một
thời điểm. Do đó các thuật toán để giải các bài toán đƣợc thiết kế để thực hiện một bƣớc tại
mỗi thời điểm. Đó là cá thuật toán nối tiếp. (Phần lớn các thuật toán mô tả ở đây là các 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 trong khoảng thời gian hợp lý bằng các thuật toán nối tiếp. 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 đƣợ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 hy 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ộ xử lý thích hợp.
Khi dùng 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 mạng kết nối các bộ xử lý trong một máy tính có nhiều bộ xử lý. Bây giờ chúng ta sẽ mô
tả các kiểu mạng kết nối thƣờng dùng nhất cho các máy xử lý song song. Kiểu mạng kết nối
thƣờng 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 đối
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 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 K
n
, đồ thị đầy đủ n đỉnh, trong đó n là
số bộ xử lý. Tuy nhiên, với các mạng liên kết này cũng có những vấn đề hết sức nghiêm túc
đặt ra, chẳng hạn, số kết nối quá nhiều. Thực ra, số các kết nối cần phải có giới hạn. Khi có
nhiều bộ xử lý thì mỗi bộ không thể nối trực tiếp với tất cả các bộ xử lý khác. Ví dụ nếu ta có
64 bộ xử lý thì có C(64,2) = 2016 kết nối, mỗi bộ xử lý nối trực tiếp với 63 bộ xử lý khác.
Mặt khác, hình nhƣ cách đơn giản nhất để kết nối n bộ xử lý với nhau là sắp xếp chúng nhƣ
một bảng một chiều hay mảng một chiều.
Mỗi bộ xử lý P
i
, khác với
P

1
và P
n
đƣợc nối với các bộ xử lý cạnh nó là P
i-1
và P
i+1
bằng các đƣờng hai chiều. P
1

đƣợc nối với P
2
và P
n
đƣợc nối với P
n-1
. Nhƣợc điểm của phƣơng pháp kết nối này 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.
Chương 7. Lý thuyết đồ thị

11

Mạng kiểu lƣới hay 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
.
Mạng kiểu lƣới cũng có một số hạn chế
số liên kết cho mỗi bộ xử lý. Sự truyền
thông giữa một số cặp bộ xử lý đòi hỏi
O(

n
) = O(m) các kết nối trung gian.
Có lẽ mạng kết nối quan trọng nhất là
mạng kiểu siêu khối. Hình 8.14. Mạng kiểu lƣới (hai chiều)
Với các mạng loại này số các bộ xử lý là lũy thừa của 2, n = 2
m
.
Mỗi bộ xử lý có liên kết 2 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 mạng kiểu 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ị Q
n
chính là
biểu diễn của mạng loại này.

7.2.6. Đồ thị con
Đôi khi để giải quyết một bài toán ta chỉ cần một phần của đồ thị. Ví dụ, chúng ta có thể chỉ
quan tâm tới một phần của mạng máy tính lớn.
Định nghĩa 6. Đồ thị con của đồ thị G = (V,H) là đồ thị H = (W,F) trong đó WV và
FE.
Định nghĩa 7. Hợp của 2 đồ thị G
1
=(V
1
,E
1
) và G

2
= (V
2
,E
2
) là một đồ thị đơn có tập các
đỉnh là V
1
V
2
và tập các cạnh là E
1
E
2
. Ta ký hiệu hợp của các đồ thị là G
1
G
2
.

7.3. BIỂU DIỄN ĐỒ THỊ VÀ SỰ ĐẲNG CẤU
7.3.1. Mở đầu
Có nhiều cách biểu diễn đồ thị. Mặc dầu về nguyên tắc việc bố trí các đỉnh và các cạnh trên
màn hình là không quan trọng, nhƣng nếu có thể chọn đƣợc cách biểu diễn thích hợp thì rất có
lợi. Thí dụ khi dùng đồ thị để biểu diễn các đƣờng bay thì tốt nhất là nên biểu diễn các đƣờng
bay đó phù hợp với thực tế.
Đôi khi hai đồ thị có dạng đúng nhƣ nhau, theo nghĩa là có một phép tƣơng ứng 1-1 giữa các
đỉnh của chúng mà vẫn bảo tồn các cạnh. Trong trƣờng hợp đó ta nói rằng hai đồ thị là đẳng
cấu. Việc xác định xem hai đồ thị có là đẳng cấu không là một bài toán quan trọng của lý
thuyết đồ thị.


Chương 7. Lý thuyết đồ thị

12
7.3.2. Biểu diễn đồ thị bằng danh sách liền kề
Một cách biểu diễn đồ thị không có cạnh bội là liệt kê tất cả các cạnh của đồ thị. Nói cách
khác để biểu diễn đồ thị không có cạnh bội ta dùng danh sách liền kề. Danh sách này chỉ rõ
các đỉnh nối với mỗi đỉnh của đồ thị.

7.3.3. Ma trận liền kề, ma trận trọng số
Khi biểu diễn đồ thị bới danh sách các đỉnh liền kề thì việc thực hiện một thuật toán có thể sẽ
rất cồng kềnh, nếu đồ thị có nhiều cạnh. Để đơn giản trong việc tính toán ta có thể biểu diễn
đồ thị bằng ma trận. Có hai kiểu ma trận thƣờng đƣợc dùng để biểu diễn đồ thị là ma trận liền
kề và ma trận liên thuộc.
Giả sử G = (V,E) là một đồ thị đơn trong đó |V|=n và các đỉnh đƣợc liệt kê một cách tùy ý
v
1
,v
2
, ,v
n
. Ma trận liền kề A (hay A
G
) của G ứng với danh sách các đỉnh này là ma trận
logic cấp nxn có phần tử ở hàng i cột j bằng 1 nếu v
i
và v
j
liền kề nhau (tức là có cạnh
nối chúng) và bằng 0 nếu chúng không đƣợc nối với nhau. Nói cách khác ma trận liền kề của

đò thị là ma trận A = [a
ij
] trong đó

a
ij
=

Lƣu ý là ma trận liền kề của một đồ thị phụ thuộc vào thứ tự liệt kê các đỉnh. Vì vậy có tới n!
ma trận liền kề khác nhau của một đồ thị n đỉnh vì có n! cách sắp xếp các đỉnh.
Ma trận liền kề của một đồ thị đơn là đối xứng, tức là a
ij
= a
ji
. Hơn thế nữa, vì đồ thị đơn
không có khuyên nên a
ii
= 0 với i =1,2,3, ,n.
Ví dụ 3. Dùng ma trận liền kề biểu diễn đồ thị trên hình sau:














0001
0011
0101
1110


Ma trận kề cũng có thể dùng để biểu diễn đồ thị vô hƣớng có khuyên và có cạnh bội (đồ thị có
khuyên đƣợc gọi là giả đồ thị, nhƣng nhiều khi ngƣời ta cũng gọi một cách đơn giản là đồ thị)
Khi có cạnh bội ma trận liền kề không còn là ma trận không-một nữa, vì phần tử ở vị trí (i,j)
của ma trận này bằng số cạnh bội nối đỉnh u
i
và đỉnh u
j
. Khuyên tại đỉnh u
i
đƣợc coi là
cạnh nối đỉnh u
i
với chính nó và đƣợc tính là một cạnh. Tất cả các đồ thị vô hƣớng, kể cả đa
đồ thị và giả đồ thị đều có ma trận liền kề đối xứng.
1 nếu {v
i
,v
j
} là một cạnh của G
0 nếu không có cạnh nối đỉnh v
i
với đỉnh v

j
u1
u4
u3
u2
Chương 7. Lý thuyết đồ thị

13

Ví dụ 5. Dùng ma trận liền kề biểu diễn giả đồ thị trên hình dƣới đây.













0212
2110
1103
2030


Ma trận liền kề của đồ thị có hƣớng:

Ma trận liền kề của đồ thị có hƣớng không có tính đối xứng.
Cũng có thể dùng ma trận kề biểu diễn đa đồ thị có hƣớng . Ma trận khi đó không phải là ma
trận không-một khi có cạnh bội cùng hƣớng nối hai đỉnh. Trong ma trận liền kề của đa đồ thị
có hƣớng, a
ij
bằng số các cung đi từ đỉnh v
i
đến đỉnh v
j
.
Ma trận trọng số
Trong rất nhiều ứng dụng khác nhau của lý thuyết đồ thị, mỗi cạnh e =(u,v) của nó đƣợc
gán bởi một số c(e) = c(u,v) gọi là trọng số của cạnh e. Đồ thị trong trƣờng hợp nhƣ vậy gọi là
đồ thị trọng số. Trong trƣờng hợp đó, ma trận kề của đồ thị đƣợc thay bởi ma trận trọng số c=
c[i,j], i, j= 1, 2, . . ., n. c[i,j] = c(i,j) nếu (i, j)

E, c[i,j] =

nếu (i, j)

E. Trong đó,

nhận
các giá trị: 0,

, -

tuỳ theo từng tình huống cụ thể của thuật toán.

7.3.4. Ma trận liên thuộc

Các ma trận liên thuộc cũng có thể đƣợc dùng để biễu diễn các cạnh bội và khuyên. Các cạnh
bội đƣợc biểu diễn trong ma trận liên thuộc bằng cách dùng các cột có các phần tử giống hệt
nhau vì các cạnh này đƣợc nối với cùng một cặp các đỉnh.
G = (V,E) V = {v
1
, v
2
, , v
n
} E = {e
1
, e
2
, , e
m
}
Ma trận liên thuộc của đồ thị G là M = [m
ij
]
trong đó m
ij
=1 nếu cạnh e
j
liên thuộc với đỉnh v
i
và = 0 nếu cạnh e
j
không liên thuộc với
đỉnh v
i

.

7.3.5. Sự đẳng cấu của các đồ thị
Thƣờng ngƣời ta cần biết xem có thể vẽ đƣợc hai đồ thị theo cùng một cách không. Chẳng
hạn trong hóa học, dồ thị thƣờng để tạo mô hình các hợp chất. Các hợp chất khác nhau có thể
có cùng công thức phân tử nhƣng cấu trúc có thể khác nhau. Các hợp chất nhƣ vậy sẽ đƣợc
biểu diễn bằng các dồ thị mà ta không thể vẽ đƣợc cùng một cách. Những đồ thị biễu diễn các
hợp chất đã biết có thể đƣợc dùng để xác định xem một hợp chất cho là mới thực chất đã biết
từ trƣớc chƣa.
Sau đây là một vài thuật ngữ đối với các đồ thị có cấu trúc nhƣ nhau.
u1
u4
u3
u2
Chương 7. Lý thuyết đồ thị

14
Định nghĩa 1. Các đồ thị đơn G
1
=(V
1
,E
1
) và G
2
=(V
2
,E
2
) là đẳng cấu nếu có hàm song ánh

f từ V
1
lên V
2
sao cho các đỉnh a và b là liền kề trong G
1
nếu và chỉ nếu f(a) và f(b)
là liền kề trong G
2
với mọi a và b trong V
1
. Hàm f nhƣ thế đƣợc gọi là một đẳng cấu.
Nói cách khác khi hai đơn đồ thị là đẳng cấu, sẽ tồn tại một phép tƣơng ứng một-một giữa các
đỉnh của đồ thị bảo toàn quan hệ liền kề.
Ví dụ 8. Hãy chỉ ra rằng các đồ thị G = (V,E) và H = (W,F) trên hình 8 là đẳng cấu.





G
H
Giải. Đặt f với f(u
1
) = v
1
, f(u
2
) = v
4

, f(u
3
) = v
3
, f(u
4
) = v
2
. Ta thấy f là phép tƣơng ứng một
- một hay là một song ánh từ G đến H. Hơn nữa ta có thể thấy rằng phép tƣơng ứng này
bảo toàn quan hệ liền kề.
Thông thƣờng việc xác định xem hai đồ thị có là đẳng cấu hay không là rất khó khăn. Có tới
n! phép tƣơng ứng một-một giữa hai đồ thị có n đỉnh. Thử mỗi phép tƣơng ứng xem nó có
bảo toàn tính liền kề hay không là không thực tế, nhất là khi n đủ lớn.
Tuy nhiên thƣờng ngƣời ta chứng tỏ hai đơn dồ thị là không đẳng cấu bằng cách chỉ ra chúng
không có chung một tính chất mà các đơn đồ thị đẳng cấu cần phải có. Tính chất nhƣ thế gọi
là một bất biến đối với phép đẳng cấu của các đơn đồ thị. Chẳng hạn, các đơn đồ thị có cùng
số đỉnh, số cạnh, bậc

7.4. TÍNH LIÊN THÔNG
7.4.1. Mở đầu
Nhiều bài toán có thể đƣợc mô hình với các đƣờng đi dọc theo các cạnh của đồ thị. Ví dụ,
ngƣời ta dùng đồ thị để nghiên cứu bài toán xác định xem có thể gửi một thông báo giữa 2
máy tính qua đƣờng truyền thông trung gian không. Dùng mô hình có đƣờng đi trong đồ thị
cũng có thể giải đƣợc các bài toán tìm đƣờng tối ƣu cho xe phát thƣ, xe đổ rác, việc chẩn đoán
mạng máy tính.

7.4.2. Đường đi
Định nghĩa 1.
u

1
u
2
u
3
u
4
v
4
v
3
v
2
v
1
Chương 7. Lý thuyết đồ thị

15
Đƣờng đi độ dài n từ u tới v, với n là một số nguyên dƣơng, trong một đồ thị vô hƣớng là
một dãy các cạnh e
1
,e
2
, ,e
n
của đồ thị sao cho f(e
1
) = {x
0
,x

1
}, f(e
2
) = {x
1
,x
2
}, , f(e
n
)= {x
n-
1
,x
n
}, với x
0
= u và x
n
= v. Khi đồ thị là đơn ta ký hiệu đƣờng đi này bằng dãy các đỉnh x
0
,
x
1
, , x
n
(vì danh sách các đỉnh này xác định duy nhất đƣờng đi). Đƣờng đi đƣợc gọi là chu
trình nếu nó bắt đầu và kết thúc tại cùng một đỉnh, tức là u = v. Đƣờng đi hoặc chu trình khi
đó gọi là đi qua các đỉnh x
1
,x

2
, ,x
n-1
. Đƣờng đi hoặc chu trình đƣợc gọi là đơn nếu nó không
chứa một cạnh quá một lần.
Một đƣờng đi đƣợc gọi là đƣờng đi sơ cấp nếu nó đi qua các đỉnh đúng một lần, trừ đỉnh
đầu và đỉnh cuối. Đƣờng đi sơ cấp có đỉnh đầu và đỉnh cuối trùng nhau đƣợc gọi là chu trình
sơ cấp.
Khi không cần phân biệt các cạnh bội ta sẽ ký hiệu đƣờng đi e
1
,e
2
, ,e
n
trong đó f(e
i
) = {x
i-
1
,x
i
} với i = 1,2, ,n bằng dãy các đỉnh x
0
, x
1
, ,e
n
. Ký hiệu này xác định đƣờng đi theo các
đỉnh mà nó đi qua.
Ví dụ 1.

Trong đồ thị đơn trên hình bên a,d,c,f,e
là đƣờng đi đơn độ dài 4 vì {a,d}, {d,c},
{c,f} và {f,e} đều là các cạnh. Tuy vậy
d, e, c, a không là đƣờng đi vì {e,c} không
là cạnh của đồ thị. Còn b,c,f,e,b là một chu
trình độ dài 4 vì {b,c}, {c,f}, {f,e} và {e,b} là các cạnh và đƣờng đi này bắt đầu và kết
thúc tại b. Đƣờng đi a,b,e,d,a,b độ dài 5 không là đƣờng đi đơn vì nó chứa cạnh {a,b} hai
lần.
Đƣờng đi và chu trình trong đồ thị có hƣớng cũng đã đƣợc đƣa vào từ chƣơng 6. Bây giờ ta
định nghĩa đƣờng đi nhƣ vậy cho đồ thị có hƣớng.
Định nghĩa 2.
Đƣờng đi độ dài n từ u tới v, với n là một số nguyên dƣơng, trong đa đồ thị có hƣớng là
một dãy các cạnh e
1
,e
2
, ,e
n
của đồ thị sao cho f(e
1
) = {x
0
,x
1
}, f(e
2
) = {x
1
,x
2

}, , f(e
n
)= {x
n-
1
,x
n
}, với x
0
= u và x
n
= v. Khi đồ thị là đơn (không có cạnh bội trong đồ thị) ta ký hiệu
đƣờng đi này bằng dãy các đỉnh x
0
, x
1
, , x
n
(vì danh sách các đỉnh này xác định duy nhất
đƣờng đi). Đƣờng đi đƣợc gọi là chu trình nếu nó bắt đầu và kết thúc tại cùng một đỉnh, tức
là u = v. Đƣờng đi hoặc chu trình khi đó gọi là đi qua các đỉnh x
1
,x
2
, ,x
n-1
.
Đƣờng đi hoặc chu trình đƣợc gọi là đơn
nếu nó không chứa một cạnh quá một lần
(nhƣng có thể chứa một đỉnh quá một lần

thí dụ: a,b,c,d,b,e,a là một chu trình đơn, mặc dầu chứa đỉnh b 2 lần. Tƣơng tự
a,b,c,d,b,e là một đƣờng đi đơn)
Khi không cần phân biệt các cạnh bội ta sẽ ký hiệu đƣờng đi e
1
,e
2
, ,e
n
trong đó f(e
i
) = {x
i-
1
,x
i
} với i = 1,2, ,n bằng dãy các đỉnh x
0
, x
1
, ,x
n
. Ký hiệu này xác định đƣờng đi theo các
đỉnh mà nó đi qua.

a
f
e
d
c
b

d
a
c
b
e
f
Chương 7. Lý thuyết đồ thị

16
7.4.3. Tính liên thông trong đồ thị vô hướng
Khi nào một cặp máy tính trong một mạng máy tính có thể trao đổi thông tin với nhau, nếu
các thông tin có thể gửi qua một hay nhiều máy trung gian? Nếu mạng máy tính đƣợc biểu
diễn bằng một đồ thị trong đó mỗi máy đƣợc biểu thị bằng một đỉnh còn mỗi đƣờng truyền
thông đƣợc biểu diễn bằng một cạnh, thì câu hỏi trên có dạng: có phải luôn tồn tại một đƣờng
đi giữa hai đỉnh trong một đồ thị không?
Định nghĩa 3.
Một đồ thị vô hƣớng đƣợc gọi là liên thông nếu có đƣờng đi giữa hai điểm bất kỳ của đồ thị.
Nhƣ vậy, hai máy tính bất kỳ trong mạng có thể truyền thông đƣợc với nhau nếu và chỉ nếu
đồ thị của mạng này là liên thông.
Ví dụ 2. Đồ thị G trên hình bên là liên thông.
Còn đồ thị H thì không.
Định lý 1. Giữa mọi cặp đỉnh phân biệt của
một đồ thị vô hƣớng liên thông luôn luôn có
đƣờng đi đơn. G H
Chứng minh.
Giả sử có một đƣờng đi giữa hai đỉnh phân biệt u, v của đồ thị liên thông G. Vì G liên
thông nên có một đƣờng đi giữa u và v. Gọi x
0
,x
1

, ,x
n
với x
0
= u , x
n
= v, và là đƣờng đi
ngắn nhất giữa u và v. Ta sẽ chứng minh đây là đƣờng đi đơn. Thật vậy, giả sử đƣờng đi
này không phải là đƣờng đi đơn, khi đó có một đỉnh x
i
lặp lại, tức là tồn tại 0 i < j  n sao
cho x
i
= x
j
.
(Chú ý: trong đƣờng đi đơn vẫn có thể có đỉnh
đƣợc lặp lại. Ví dụ nhƣ đƣờng đi a,b,c,d,b,e
là đƣờng đi đơn. Tuy nhiên đƣờng đi không đơn
là điều kiện đủ để có đỉnh lặp lại, vì nếu có cạnh lặp lại thì có đỉnh lặp lại nhƣng ngƣợc lại thì
chƣa chắc)
Điều này có nghĩa là giữa u và v có
đƣờng đi ngắn hơn là x
0
,x
1
, ,x
i-1
,x
j

, ,x
n
,
mâu thuẫn với giả thiết của ta.
Vậy đƣờng đi ngắn nhất phải là đƣờng đi đơn.
Một đồ thị không liên thông là hợp của hai hay nhiều đồ thị con liên thông, mỗi cặp các đồ thị
con này không có đỉnh chung. Các đồ thị con liên thông rời nhau nhƣ vậy đƣợc gọi là các
thành phần liên thông của đồ thị đang xét.
Ví dụ ở hình trên đây đồ thị H có hai thành phần liên thông.
Đôi khi việc xóa đi một đỉnh và tất cả các cạnh liên thuộc với nó sẽ tạo ra một đồ thị con có
nhiều thành phần liên thông hơn đồ thị ban đầu. Các đỉnh nhƣ thế đƣợc gọi là các đỉnh cắt
hay các điểm khớp. Việc xóa một đỉnh cắt khỏi đồ thị liên thông sẽ tạo ra một đồ thị con
không liên thông.
a
c
b
e
f
d
Chương 7. Lý thuyết đồ thị

17
Một cạnh mà khi bỏ nó đi sẽ đƣợc đồ thị con có nhiều thành phần liên thông hơn so với đồ thị
ban đầu thì cạnh đó đƣợc gọi là cạnh cắt hay cầu.
Ví dụ 4. Tìm các đỉnh và cạnh cắt
trong đồ thị sau:
Giải. Đỉnh cắt của G là b,c và e.
Các cạnh cắt là {a,b} và {c,e}.

7.4.4. Tính liên thông trong đồ thị có hướng

Có hai khái niệm về tính liên thông trong đồ thị có hƣớng tùy theo chúng ta có quan tâm đến
hƣớng của chúng hay không.
Định nghĩa 4. Đồ thị có hƣớng đƣợc gọi là liên thông mạnh nếu có đƣờng đi từ a tới b và
từ b tới a với mọi đỉnh a và b bất kỳ của đồ thị.
Định nghĩa 5. Đồ thị có hƣớng đƣợc gọi là liên thông yếu nếu có đƣờng đi giữa hai đỉnh bất
kỳ của đồ thị vô hƣớng nền. (Nhƣ vậy đồ thị liên thông mạnh thì cũng liên thông yếu)
Vậy đồ thị có hƣớng là liên thông yếu nếu và chỉ nếu luôn tồn tại đƣờng đi giữa hai đỉnh nếu
ta không quan tâm đến hƣớng của các cạnh. Chú ý rằng trong đồ thị liên thông yếu thì có thể
không có đƣờng đi giữa a và b và không có đƣờng đi từ b đến a với 2 đỉnh a, b nào
đó.
Ví dụ 5. Đồ thị G là liên thông
mạnh. Đồ thị H là liên thông yếu.

G H
Định nghĩa 6.
Đồ thị liên thông không có bất kỳ chu trình nào đƣợc gọi là một cây, một nhóm cây trong
đó không có 2 cây nào đƣợc nối với nhau đƣợc gọi là một rừng. Rừng bao trùm của một đồ
thị là rừng và là đồ thị con của đồ thị đó và chứa tất cả các nút của đồ thị; rừng gồm các cây
T
1
, T
2
, ,T
m
trong đó cây T
i
chứa tất cả các nút liên thông với nút gốc của nó trong đồ thị.
Nếu rừng bao trùm chỉ gồm một cây thì cây đó đƣợc gọi là Cây bao trùm của đồ thị đó.










Hình 7.15. Đồ thị và cây bao
trùm
a
g
f
d
h
e
c
b
a
d
c
b
e
a
d

A

D
B
C

E

G
F

A

D
B
C
E

G
F
Chương 7. Lý thuyết đồ thị

18

Nhƣ vậy nếu ta thêm một cạnh bất kỳ vào cây bao trùm thì sẽ có một chu trình vì đã sẵn có
một đƣờng đi nối 2 đỉnh của cạnh thêm vào. Chúng ta có thể thấy rằng cây có V đỉnh thì có
chính xác V-1 cạnh. Nếu một đồ thị có V đỉnh mà có ít hơn V-1 cạnh thì không liên thông,
nếu đồ thị có nhiều hơn V-1 cạnh thì phải có một chu trình. Ký hiệu V là số đỉnh của đồ thị.
Nếu tất cả các cặp đỉnh đều có đƣờng nối thì tổng số cạnh là V(V-1)/2. Ta gọi đồ thị nhƣ vậy
là đồ thị đầy đủ. Đồ thị có số cạnh nhỏ hơn VlogV đƣợc gọi là đồ thị thƣa. Đồ thị mà hầu
hết các đỉnh đều đƣợc nối với nhau đƣợc gọi là đồ thị dày.

7.4.5. Đường đi và sự đẳng cấu
Có một số cách dùng đƣờng đi và chu trình để xác định xem hai đồ thị có đẳng cấu hay
không. Chẳng hạn sự tồn tại chu trình đơn với độ dài đặc biệt là một bất biến rất có ích để chỉ
ra hai đồ thị là không đẳng cấu. Thêm vào đó, đƣờng đi có thể dùng để xây dựng các ánh xạ

có khả năng là các phép đẳng cấu.
Một bất biến đẳng cấu rất có ích đối với các đơn đồ thị là sự tồn tại chu trình đơn với độ dài k
lớn hơn 2. Ví dụ 6 minh họa cách dùng bất biến này để chứng tỏ hai đồ thị là không đẳng
cấu.
Ví dụ 6. Cả hai đồ thị G và H
đều 6 đỉnh, 8 cạnh. Mỗi đồ thị có
4 đỉnh bậc 3 và 2 đỉnh bậc 2.
Vì thế 3 bất biến: số đỉnh,
số cạnh, bậc của các đỉnh của hai
đồ thị là nhƣ nhau. Tuy nhiên H có
chu trình đơn độ dài 3, cụ thể là a,b,f G H
trong khi đó tất cả các chu trình của G đều có độ dài 4.
Vì sự tồn tại chu trình đơn độ dài 3 là một bất biến đối với phép đẳng cấu nên các đồ thị G
và H không đẳng cấu.
Chúng ta cũng có thể dùng đƣờng đi để tìm các ánh xạ có khả năng là đẳng cấu.
Ví dụ 7. Cả hai đồ thị
G và H đều có 5 đỉnh
và 6 cạnh, cả hai đều có
hai đỉnh bậc 3 và ba đỉnh
bậc 2; cả hai đều có một
chu trình đơn độ dài 3, G H
a
f
e
d
c
b
a
f
e

d
c
b
u2
u1
u3
u4
u5
v5
v4
v3
v2
v1
Chương 7. Lý thuyết đồ thị

19
một chu trình đơn độ dài 4, và một chu trình đơn độ dài 5. Vì tất cả các bất biến đều phù hợp
nên có thể hai đồ thị này đẳng cấu. Để tìm phép đẳng cấu có thể này chúng ta đi theo đƣờng
đi qua tất cả các đỉnh sao cho các đỉnh tƣơng ứng trong hai đồ thị có cùng bậc. Ví dụ, các
đƣờng đi u1, u4, u3, u2, u5 trong G và v3, v2, v1, v5, v4 trong H. Cả hai đều đi qua mọi
đỉnh của đồ thị xuất phát từ đỉnh bậc 3, đi qua các đỉnh bậc 2,3,2 và kết thúc ở đỉnh bậc 2.
Theo các đƣờng này, trên đồ thị ta có ánh xạ f sao cho f(u1) = v3, f(u4) = v2, f(u3) = v1,
f(u2) = v5 và f(u5) = v4. Có thể chỉ ra rằng ánh xạ này là một đẳng cấu.

7.4.6. Đếm đường đi giữa các đỉnh
Số đƣờng đi giữa hai đỉnh của đồ thị có thể xác định đƣợc khi sử dụng ma trận kề.

Định lý 2. Cho G là một đồ thị với ma trận liền kề A theo thứ tự các đỉnh v
1
,v

2
, ,v
n
(với
các cạnh vô hƣớng hoặc có hƣớng hay là cạnh bội, hoặc có thể có khuyên). Số các đƣờng đi
khác nhau độ dài r từ v
i
đến v
j
trong đó r là một số nguyên dƣơng, bằng giá trị của phần
tử (i,j) của ma trận A
r
.
Chứng minh. Giả sử A là ma trận liền kề của đồ thị G với cách sắp xếp các đỉnh theo thứ
tự v
1
,v
2
, ,v
n
. Theo định nghĩa thì phần tử a
ij
tại vị trí (i,j) của ma trận A chính là số
đƣờng đi độ dài 1 từ đỉnh v
i
đến đỉnh v
j
.
Vậy với r = 1 định lý đúng.
Giả sử định lý đúng với r = k, tức là phần tử (i,j) của ma trận A

k
là số các đƣờng đi khác
nhau có độ dài k từ đỉnh v
i
đến đỉnh v
j
. Vì A
k+1
= A
k
A nên phần tử (i,j) của A
k+1
bằng
b
i1
a
1j
+ b
i2
a
2j
+ + b
in
a
nj
trong đó b
ih
là phần tử (i,h) của ma trận A
k
. Theo giả thiết quy

nạp thì b
ih
là số đƣờng đi độ dài k từ đỉnh v
i
đến đỉnh v
h
.
Đƣờng đi độ dài k+1 từ v
i
đến v
j
sẽ đƣợc tạo nên từ đƣờng đi độ dài k từ v
i
đến một
đỉnh trung gian v
h
nào đó và một cạnh từ v
h
đến v
j
. Theo quy tắc nhân thì số các đƣờng đi
nhƣ thế là tích của số đƣờng đi độ dài k từ v
i
đến v
h
tức là b
ih
và số các cạnh từ v
h
tới v

j

, tức là a
hj
. Khi cộng các tích này lại theo tất cả các đỉnh trung gian ta đƣợc kết quả mong
muốn.
Ví dụ 8. Có bao nhiêu đƣờng đi độ dài 4 từ u1 tới u4 trong đồ thị đơn G trên hình sau:
Giải.
A =












0110
1001
1001
0110

Do đó, đƣờng đi độ dài 4 từ u1 tới u4 là giá trị của phần tử (1,4) của ma trận A
4
.
Vì A

4
=












8008
0880
0880
8008
nên có đúng 8 đƣờng đi độ dài 4 từ u1 đến u4. Kiểm tra trực
tiếp trên đồ thị ta đƣợc 8 đƣờng đi độ dài 4 từ u1 đến u4 là:
u1
u4

u3
u2
Chương 7. Lý thuyết đồ thị

20
u1,u2,u1,u2,u4,u1,u2,u1,u3,u4,
Định lý trên có thể dùng để tìm độ dài của đƣờng đi ngắn nhất giữa hai đỉnh của đồ thị và

cũng có thể dùng để xác định xem đồ thị có liên thông hay không.

7.4.7. Phương pháp duyệt đồ thị
Trong các phép toán xử lý trên đồ thị chúng ta gặp nhiều câu hỏi nảy sinh nhƣ: đồ thị có
liên thông không?, nếu không thì hãy cho biết các thành phần liên thông của đồ thị, đồ thị có
chu trình nào không? Những câu hỏi này và nhiều câu hỏi khác dẫn tới việc chúng ta phải tìm
ra phƣơng pháp để "viếng thăm" tất cả các nút của đồ thị một cách có hệ thống. Mục đích
cuối cùng của chúng ta dĩ nhiên không chỉ là liệt kê tên hay nội dung của các đỉnh, vì nếu chỉ
nhƣ vậy thì trong cách cài đặt chúng ta đã gán các chỉ số 1, ,n cho các đỉnh và nhƣ vậy ta
chỉ cần lần lƣợt đi từ đỉnh 1 đến đỉnh n là thăm đƣợc hết tất cả các đỉnh. Ta phải đi qua
các đỉnh và các cạnh của đồ thị một cách có hệ thống để thực hiện một thuật toán nào đó, thí
dụ tìm các thành phần liên thông hay rừng bao trùm của đồ thị. Có 2 phƣơng pháp duyệt đồ
thị là duyệt đồ thị theo độ sâu và theo bề rộng.

a. Duyệt đồ thị theo độ sâu (Depth - first traverse)
Tƣ tƣởng của phƣơng pháp này đƣợc thực hiện nhƣ sau:
Khi đang ở đỉnh v trƣớc hết ta thăm đỉnh đó, sau đó thăm từng đỉnh kề theo độ sâu. Nghĩa
là giả sử đỉnh A có các đỉnh kề là B,C, (tức là có cạnh nối giữa chúng với A), giả sử sau
khi thăm A ta đi đến đỉnh B và thăm đỉnh B, nếu B có đỉnh kề thì ta tiếp tục đi sâu xuống
thăm đỉnh kề nào đó của B và cứ nhƣ vậy, chỉ khi đã thăm hết các đỉnh kề của B theo độ sâu
thì ta mới trở lại thăm nút C theo độ sâu. Quá trình trên dừng lại khi ta không thể đến thăm
một đỉnh kề nào nữa. Bây giờ nếu còn đỉnh chƣa đƣợc thăm thì ta chọn một đỉnh để thăm và
tiếp tục quá trình trên.
Để kiểm tra việc duyệt mỗi đỉnh đúng một lần, chúng ta sử dụng một mảng chuaxet[] gồm
n phần tử (tƣơng ứng với n đỉnh), nếu đỉnh thứ i đã đƣợc duyệt, phần tử tƣơng ứng trong
mảng chuaxet[] có giá trị FALSE. Ngƣợc lại, nếu đỉnh chƣa đƣợc duyệt, phần tử tƣơng ứng
trong mảng có giá trị TRUE. Thuật toán có thể đƣợc mô tả bằng thủ tục đệ qui DFS () trong
đó: chuaxet - là mảng các giá trị logic đƣợc thiết lập giá trị TRUE.
void DFS( int v){
Thăm_Đỉnh(v); chuaxet[v] := FALSE;

for ( u

ke(v) ) {
if (chuaxet[u] )
DFS(u);
}
}
Thủ tục DFS() sẽ thăm tất cả các đỉnh cùng thành phần liên thông với v mỗi đỉnh đúng
một lần. Để đảm bảo duyệt tất cả các đỉnh của đồ thị (có thể có nhiều thành phần liên thông),
chúng ta chỉ cần thực hiện duyệt nhƣ sau:
Chương 7. Lý thuyết đồ thị

21
{
for (i=1; i

n ; i++)
chuaxet[i] := TRUE; /* thiết lập giá trị ban đầu cho mảng chuaxet[]*/
for (i=1; i

n ; i++)
if (chuaxet[i] )
DFS( i);
}
Ví dụ 9. áp dụng thuật toán tìm kiếm theo chiều sâu với đồ thị trong hình sau:


Đỉnh bắt đầu duyệt
Các đỉnh đã duyệt
Các đỉnh chưa duyệt

DFS(1)
1
2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13
DFS(2)
1, 2
3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13
DFS(4)
1, 2, 4
3, 5, 6, 7, 8, 9, 10, 11, 12, 13
DFS(3)
1,2,4, 3
5, 6, 7, 8, 9, 10, 11, 12, 13
DFS(6)
1,2,4,3, 6
5, 7, 8, 9, 10, 11, 12, 13
DFS(7)
1,2,4,3, 6,7
5, 8, 9, 10, 11, 12, 13
DFS(8)
1,2,4,3, 6,7,8
5, 9, 10, 11, 12, 13
DFS(10)
1,2,4,3, 6,7,8,10
5, 9, 11, 12, 13
DFS(5)
1,2,4,3, 6,7,8,10,5
9, 11, 12, 13
DFS(9)

1,2,4,3, 6,7,8,10,5,9
11, 12, 13
DFS(13)
1,2,4,3, 6,7,8,10,5,9,13
11, 12
DFS(11)
1,2,4,3, 6,7,8,10,5,9,13,11
12
DFS(11)
1,2,4,3, 6,7,8,10,5,9,13,11,12

Chương 7. Lý thuyết đồ thị

22
Kết quả duyệt: 1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12

Ví dụ 10:Cho đồ thị G = (V,E) , V = {1,2,3,4,5} đƣợc biểu diễn bằng ma trận kề nhƣ sau:

1
2
3
4
5
1
0
1
0
0
1
2

1
0
0
1
1
3
0
0
0
1
0
4
0
1
1
0
0
5
1
1
0
0
0
Hãy mô tả thuật toán duyệt đồ thị theo chiều sâu xuất phát từ đỉnh 2, với lƣu ý là khi
có nhiều đỉnh cùng khả năng lựa chọn thì ưu tiên chọn đỉnh có chỉ số nhỏ hơn.
Lời giải.
Ta sẽ dùng mảng CX[i], i=1,2,3,4,5 để đánh dấu tình trạng của đỉnh i, nếu đỉnh i
chƣa xét thì CX[i]=1, nếu xét rồi thì CX[i]=0, mảng P[i] để đánh dấu đỉnh đứng trƣớc đỉnh
i trong quá trình duyệt.
Bước 0. Bƣớc khởi tạo. Ban đầu ta đặt các phần tử của mảng CX[] đều bằng 1, còn các phần

tử của P[] đều bằng -1, tức là không có đỉnh nào đứng trƣớc đỉnh i.
CX = (1,1,1,1,1) , P = (-1,-1,-1,-1,-1). Ta dùng mảng KQ[] để lƣu kết quả phép
duyệt. Ban đầu mảng KQ[] chƣa có phần tử nào.
Bước 1. CX = (1,0,1,1,1) , P = (-1,-1,-1,-1,-1), KQ = (2)
Bước 2. Đỉnh 2 có đỉnh kề với chỉ số nhỏ nhất là 1, do đó
CX = (0,0,1,1,1) , P = (2,-1,-1,-1,-1), KQ = (2,1)
Bước 3. Đỉnh 1 có các đỉnh kề là 2 và 5, nhƣng đỉnh 2 đã xét, do đó ta duyệt đỉnh 5
CX = (0,0,1,1,0) , P = (2,-1,-1,-1,1), KQ = (2,1,5)
Bước 4. Đỉnh 5 có các đỉnh kề là 1 và 2, nhƣng cả hai đều đã duyệt ta quay về đỉnh đứng
trƣớc nó, là đỉnh 1. Đỉnh 1 có các đỉnh kề là 2 và 5 đều đã duyệt, do đó ta lại phải
về đỉnh đứng trƣớc đỉnh 1 là đỉnh 2. Đỉnh 2 có các đỉnh kề là 1, 4,5. Các đỉnh 1,5
đã duyệt, còn lại đỉnh 4, ta duyệt đỉnh này và có kết quả sau:
CX = (0,0,1,0,0) , P = (2,-1,-1,2,1), KQ = (2,1,5,4)
Bước 5. Đỉnh 4 có các đỉnh kề là 2 và 3, nhƣng đỉnh 2 đã xét, do đó ta duyệt đỉnh 3
CX = (0,0,0,0,0) , P = (2,-1,4,2,1), KQ = (2,1,5,4,3)
Từ kết quả này ta có thể thấy là đƣờng đi từ 2 đến 3 là: 2, 4, 3 . Từ mảng P ta thấy rằng
trƣớc đỉnh 3 là đỉnh 4 và đứng trƣớc đỉnh 4 là đỉnh 2.
Bằng cách trên đây ta có thể lần lƣợt duyệt các thành phần liên thông của một đồ thị. Ban đầu
ta chọn một đỉnh bất kỳ để duyệt (thông thƣờng ta chọn đỉnh 1). Sau khi kết thúc duyệt theo
độ sâu từ đỉnh này ta nhận đƣợc thành phần liên thông thứ nhất của đồ thị. Ta chọn tiếp một
đỉnh chƣa xét có chỉ số nhỏ nhất chƣa duyệt và lại thực hiện duyệt theo chiều sâu xuất phát từ
đỉnh này và nhận đƣợc thành phần liên thông thứ 2, cứ nhƣ vậy cho đến khi tất cả các đỉnh
Chương 7. Lý thuyết đồ thị

23
đều đƣợc duyệt.

b. Duyệt đồ thị theo bề rộng (Breadth - first traverse)
Phƣơng pháp này đƣợc thực hiện nhƣ sau:
Khi đang ở đỉnh A trƣớc hết ta thăm đỉnh đó, sau đó ta tiếp tục thăm các đỉnh kề của A,

thí dụ các đỉnh B, C, Khi đã thăm hết các đỉnh kề của đỉnh A thì ta quay lại thăm các đỉnh
kề của B, hết đỉnh kề của B ta thăm đến đỉnh kề của C và cứ nhƣ thế. Nhƣ vậy đỉnh kề nào
đƣợc thăm trƣớc thì các đỉnh con của nó cũng đƣợc thăm trƣớc. Quá trình trên dừng lại khi ta
không thể đến thăm một đỉnh kề nào nữa. Bây giờ nếu còn đỉnh chƣa đƣợc thăm thì ta chọn
một đỉnh để thăm và tiếp tục quá trình trên. Ta thấy cách duyệt đồ thị theo bề rộng giống với
cách duyệt cây theo tầng.

c. So sánh hai phƣơng pháp duyệt đồ thị
Ta lƣu ý rằng cả hai cách duyệt cây nói trên đều không cho kết quả duy nhất, vì nó phụ
thuộc vào việc chọn đỉnh xuất phát và thứ tự thăm các đỉnh kề của mỗi đỉnh.
Cả 2 cách duyệt đều cho ta rừng bao trùm của đồ thị, trong đó mỗi cây của rừng là một thành
phần liên thông. Rừng bao trùm theo chiều sâu chứa các cây hẹp và cao, rừng bao trùm theo
chiều rộng chứa các cây rộng và ngắn.








Hình 7.16 Đồ thị và ma trận kề
Với đồ thị ở hình 8.16 , phép duyệt theo chiều sâu cho ta thứ tự các nút là 1 - 2 - 4 - 3,
còn theo chiều rộng ta có thứ tự các nút đƣợc duyệt là 1 - 2 - 3 - 4.
Chúng ta có thể dùng đệ quy hoặc cấu trúc stack để duyệt đồ thị theo chiều sâu. Còn với
phƣơng pháp duyệt theo bề rộng thì một cấu trúc hàng đợi sẽ thích hợp hơn.

d. Cài đặt các thuật toán duyệt đồ thị trên máy tính:
Dƣới đây là văn bản chƣơng trình.đã sử dụng thủ tục đệ qui để duyệt. Trong đó các hàm :


void Init(int G[][MAX], int *n): dùng để đọc dữ liệu là từ tệp DFS.IN là biểu diễn của
đồ thị dƣới dạng ma trận kề . A là ma trận vuông lƣu trữ biểu diễn của đồ thị

void DFS(int G[][MAX], int n, int v, int chuaxet[]): là thuật toán duyệt theo chiều sâu
2
1
4
3
1 2 3 4

1 0 1 1 0
2 1 0 0 1
3 1 0 0 0
4 0 1 0 0

Chương 7. Lý thuyết đồ thị

24
với đồ thị G gồm n đỉnh và đỉnh bắt đầu duyệt là v.
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <dos.h>
#define MAX 100
#define TRUE 1
#define FALSE 0
/* Depth First Search */
void Init(int G[][MAX], int *n){
FILE *fp; int i, j;

fp=fopen("DFS.IN", "r");
if(fp==NULL){
printf("\n Khong co file input");
delay(2000);return;
}
fscanf(fp,"%d", n);
printf("\n So dinh do thi:%d",*n);
printf("\n Ma tran ke cua do thi:");
for(i=1; i<=*n;i++){
printf("\n");
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
printf("%3d", G[i][j]);
}
}
}
void DFS(int G[][MAX], int n, int v, int chuaxet[]){
int u;
printf("%3d",v);chuaxet[v]=FALSE;
for(u=1; u<=n; u++){
if(G[v][u]==1 && chuaxet[u])
DFS(G,n, u, chuaxet);
}
}
void main(void){
Chương 7. Lý thuyết đồ thị

25
int G[MAX][MAX], n, chuaxet[MAX];
Init(G, &n);

for(int i=1; i<=n; i++)
chuaxet[i]=TRUE;
printf("\n\n");
for(i=1; i<=n;i++)
if(chuaxet[i])
DFS( G,n, i, chuaxet);
getch();
}

Để cài đặt phƣơng pháp duyệt đồ thị theo chiều sâu ta cần đến cấu trúc Stack, còn để duyệt đồ
thị theo bề rộng ta cần cấu trúc Queue ( hàng đợi)
Sau đây là đoạn chƣơng trình sử dụng Stack để duyệt đồ thị theo chiều sâu:
void Dtraverse(kmatran a, kvecto &chuaxet, int k, int n)
{Stack<int> S(20);int i,h;
S.push(k);chuaxet[k]=false;
while(!S.empty())
{h=S.pop();
printf("%5d",h);
for(i=n;i>=1;i )
if(chuaxet[i] && a[h][i]) {S.push(i);chuaxet[i]=0;}
}
return;
}

7.5. ĐƢỜNG ĐI EULER VÀ ĐƢỜNG ĐI HAMILTON
7.5.1. Đường đi và chu trình EULER
Thành phố Konigsberg thuộc Phổ (bây giờ gọi là Kaliningrad thuộc Cộng hòa 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ỷ thứ 18 ngƣời ta
đã xây bẩy chiếc cầu nối các vùng này với nhau. Hình 7.17. vẽ các vùng và các cầu qua sông.







D
C
A
B

×