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

ghép cặp và bài toán phân việc trên đồ 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 (605.23 KB, 50 trang )

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC
——————
ĐỖ THỊ THÁI LINH
GHÉP CẶP VÀ BÀI TOÁN
PHÂN VIỆC TRÊN ĐỒ THỊ
LUẬN VĂN THẠC SĨ TOÁN HỌC
Thái Nguyên, năm 2014
ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC
——————
ĐỖ THỊ THÁI LINH
GHÉP CẶP VÀ BÀI TOÁN
PHÂN VIỆC TRÊN ĐỒ THỊ
Chuyên ngành: Toán ứng dụng
Mã số: 60.46.01.12
LUẬN VĂN THẠC SĨ TOÁN HỌC
NGƯỜI HƯỚNG DẪN KHOA HỌC:
GS. TS. TRẦN VŨ THIỆU
Thái Nguyên, năm 2014
i
Mục lục
Lời cảm ơn ii
Lời mở đầu 1
1 Khái niệm cơ bản về đồ thị 3
1.1 Đồ thị và mạng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Khái niệm đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 Đường và chu trình trong đồ thị vô hướng . . . . . . . . . . . . . . 5
1.1.3 Rừng và cây . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.4 Một số dạng đồ thị đặc biệt . . . . . . . . . . . . . . . . . . . . . . 7
1.1.5 Khái niệm mạng . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9


1.2 Biểu diễn đồ thị và tìm kiếm trên đồ thị . . . . . . . . . . . . . . . . . . . 9
1.2.1 Cách biểu diễn đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.2 Các thuật toán tìm kiếm trên đồ thị . . . . . . . . . . . . . . . . . 11
2 Bài toán ghép cặp trên đồ thị 15
2.1 Ghép cặp hoàn hảo và ghép cặp cực đại . . . . . . . . . . . . . . . . . . . . 15
2.2 Ghép cặp trong đồ thị hai phần . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.1 Điều kiện tồn tại . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.2 Thuật toán Edmonds . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.3 Thuật toán Hopcroft - Karp . . . . . . . . . . . . . . . . . . . . . . 24
3 Một số ứng dụng của ghép cặp 29
3.1 Bài toán phân việc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1 Nội dung bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.2 Mô tả thuật toán giải . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.1.3 Ví dụ minh họa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Bài toán phủ cạnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3 Bài toán hôn nhân bền vững . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.4 Xếp lịch trên hai máy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Kết luận 45
Tài liệu tham khảo 46
ii
Lời cảm ơn
Trong suốt quá trình làm luận văn, tôi luôn nhận được sự hướng dẫn, chỉ
bảo tận tình và giúp đỡ nghiêm túc của GS.TS. Trần Vũ Thiệu (Viện Toán
học, Viện Hàn lâm Khoa học và Công nghệ Việt Nam). Tôi xin chân thành
bày tỏ lòng biết ơn sâu sắc đến Thầy. Thầy đã dành nhiều thời gian hướng
dẫn cũng như giải đáp thắc mắc của tôi. Thầy đã giúp đỡ tôi bổ sung nhiều
về kiến thức, khả năng nghiên cứu, chọn lọc và tổng hợp các tài liệu để hoàn
thành luận văn. Tôi xin kính chúc Thầy và gia đình luôn luôn mạnh khỏe,
hạnh phúc.
Qua đây, tôi xin gửi tới các quý Thầy, Cô tham gia giảng dạy khóa Cao

học Toán 2012 - 2014 tại trường Đại học Khoa học - Đại học Thái Nguyên
và Viện Toán học lời cảm ơn sâu sắc nhất. Các Thầy, Cô đã mang đến cho
tôi nhiều kiến thức bổ ích, không chỉ về mặt chuyên môn mà còn cả ở trong
cuộc sống.
Tôi cũng xin chân thành cảm ơn các bạn đồng nghiệp, đồng môn đã giúp
đỡ tôi trong thời gian học tập tại trường Đại học Khoa học - Đại học Thái
Nguyên và trong quá trình hoàn thành luận văn này.
Cuối cùng, tôi xin gửi lời cảm ơn sâu sắc đến gia đình tôi. Những người
đã động viên, chăm sóc và tạo mọi điều kiện tốt nhất để tôi có được thành
quả ngày hôm nay.
Thái Nguyên, tháng 9 năm 2014
Người thực hiện
Đỗ Thị Thái Linh
1
Lời mở đầu
Ghép cặp trên đồ thị là một trong những chủ đề cổ điển, nhưng quan
trọng và hấp dẫn của lý thuyết tổ hợp và tối ưu hóa. Lý thuyết ghép cặp
có ứng dụng đa dạng trong lý thuyết và thực tiễn. Thuật toán Hung-ga-ri
(1955) giải bài toán phân việc và thuật toán Gale - Shapley (1962) giải bài
toán "hôn nhân bền vững" đã rất quen thuộc và được sử dụng rộng rãi. Bài
toán phân việc (cũng gọi là bài toán ghép cặp hoàn hảo với trọng số nhỏ
nhất hay lớn nhất trong đồ thị hai phần) có ứng dụng thiết thực trong kinh
tế và đời sống. Vì thế, chủ đề ghép cặp và phân việc luôn được nhiều người
quan tâm nghiên cứu và ứng dụng.
Mục tiêu chính của đề tài luận văn là tìm hiểu và trình bày một số kết
quả lý thuyết về bài toán ghép cặp cực đại và ghép cặp hoàn hảo trên đồ thị
(chủ yếu là đồ thị hai phần), các điều kiện tồn tại ghép cặp cực đại và ghép
cặp hoàn hảo, bài toán phân việc và các ứng dụng của ghép cặp, các thuật
toán giải bài toán ghép cặp, bài toán phân việc và phân tích độ phức tạp của
các thuật toán.

Nội dung luận văn được chia thành ba chương:
Chương 1: "Khái niệm cơ bản về đồ thị" trình bày và giải thích bằng ví
dụ các định nghĩa và khái niệm cơ bản thường dùng trong lý thuyết đồ thị và
mạng: đồ thị vô hướng, đồ thị có hướng, đỉnh và cạnh, đường đi và chu trình
trong đồ thị, đồ thị liên thông. Miêu tả nhiều dạng đồ thị con khác nhau: đồ
thị con cảm sinh, đồ thị con bao trùm của một đồ thị và các dạng đồ thị đặc
biệt: rừng và cây cùng các tính chất, đồ thị đầy đủ, đồ thị hai phần. Một số
cách biểu diễn đồ thị (ma trận kề, ma trận liên thuộc, danh sách cạnh, danh
sách kề) đáng được chú ý. Hai cách tìm kiếm trên đồ thị (theo chiều rộng
BFS và theo chiều sâu DFS) rất hay được dựng trong các thuật toán về đồ
thị.
Chương 2: "Bài toán ghép cặp trên đồ thị" giới thiệu bài toán ghép cặp
2
cực đại, ghép cặp hoàn hảo trên đồ thị, điều kiện cần và đủ để tồn tại ghép
cặp cực đại trên đồ thị bất kỳ (định lý Berge) và ghép cặp hoàn hảo trên đồ
thị hai phần (định lý Hall và định lý Frobenius). Trình bày cách đưa bài toán
ghép cặp cực đại trên đồ thị hai phần về bài toán luồng lớn nhất trên mạng
và hai thuật toán đa thức tìm ghép cặp cực đại trên đồ thị hai phần: thuật
toán Edmonds với độ phức tạp tính toán O(m.n) và thuật toán Hopcroft -
Karp với độ phức tạp tốt nhất O(

n.m).
Chương 3: "Một số ứng dụng của ghép cặp" trình bày bài toán phân việc
mà thực chất là bài toán ghép cặp có trọng số lớn nhất (hay nhỏ nhất) trên
đồ thị hai phần và giới thiệu thuật toán gán nhãn giải bài toán với tên gọi
phương pháp Hung-ga-ri, thuật toán này do Kuhn và Munkres nêu ra đầu
tiên (1955). Tiếp theo luận văn trình bày một số ứng dụng quan trọng khác
của ghép cặp là bài toán phủ cạnh trên đồ thị, bài toán "hôn nhân bền vững"
và thuật toán Gale - Shapley độc đáo giải bài toán. Cuối chương là bài toán
xếp lịch trên hai máy, bài toán này đưa được về bài toán ghép cặp cực đại

trên đồ thị hai phần.
Do thời gian và kiến thức còn hạn chế nên chắc chắn luận văn không tránh
khỏi những thiếu sót nhất định, kính mong quý thầy cô và các bạn đóng góp
ý kiến để tôi tiếp tục hoàn thiện luận văn này.
3
Chương 1
Khái niệm cơ bản về đồ thị
Chương này trình bày những định nghĩa và khái niệm cơ bản thường dùng
trong lý thuyết đồ thị, nhằm thống nhất tên gọi và cách hiểu các vấn đề sẽ
được đề cập tới trong luận văn. Nội dung của chương được tham khảo chủ
yếu từ các tài liệu [3], [5] và [7].
1.1 Đồ thị và mạng
1.1.1 Khái niệm đồ thị
Có thể hiểu đồ thị là một tập hợp các điểm, gọi là nút hay đỉnh, và một
tập hợp các đoạn (thẳng hay cong) nối liền một số cặp điểm này, gọi là cạnh
hay cung của đồ thị. Mỗi đỉnh của đồ thị thường được ký hiệu bằng các chữ
cái a, b, c hoặc các chữ số 1, 2, 3, Cạnh nối đỉnh i với đỉnh j được ký
hiệu là (i, j). Nếu đồ thị G có tập đỉnh là V và tập cạnh là E thì ta viết
G = (V, E). Ta cũng dùng ký hiệu V (G) để chỉ tập đỉnh và E (G) để chỉ
tập cạnh của đồ thị G. Ký hiệu n = |V (G)| là số đỉnh và m = |E (G)| là số
cạnh của đồ thị.
Hình 1.1: Đồ thị đỉnh và cạnh Hình 1.2: Đồ thị không liên thông
Mỗi đồ thị có thể được biểu diễn bởi một hình vẽ trên mặt phẳng. Chẳng
hạn: Hình 1.1 biểu diễn một đồ thị có 7 đỉnh (đánh số từ 1 đến 7) và 9 cạnh
4
(mỗi cạnh là một đoạn thẳng nối hai đỉnh). Chú ý rằng điểm cắt nhau của
hai cạnh (1, 4) và (2, 3), cũng như của hai cạnh (4, 7) và (5, 6) trong hình
vẽ không phải là đỉnh của đồ thị.
Một cạnh của đồ thị gọi là cạnh có hướng nếu có quy định rõ một mút
của cạnh là đỉnh đầu, còn mút kia là đỉnh cuối. Cạnh có hướng còn gọi là

cung, cung đi từ đỉnh i đến đỉnh j ký hiệu là
−−→
(i, j) hoặc đơn giản là (i, j)
nếu không gây nhầm lẫn.
Hình 1.3: Đồ thị có hướng
Một đồ thị gồm toàn các cạnh gọi là đồ thị vô hướng, đồ thị gồm toàn các
cung gọi là đồ thị có hướng. Một đồ thị vừa có cạnh vừa có cung gọi là đồ
thị hỗn hợp. Bằng cách thay một cạnh bởi hai cung có hướng ngược chiều
nhau, ta có thể quy mọi đồ thị về đồ thị có hướng. Hình 1.3 mô tả một đồ
thị có hướng.
Nếu e = (u, v) là một cạnh thì ta nói e liên thuộc hai đỉnh u, v hoặc e nối
u, v. Khi đó, u và v gọi là kề nhau và là đầu mút của e, u(v) là láng giềng
của v(u). Khi e = (u, v) là cung, ta nói u là đỉnh đầu, v là đỉnh cuối và e đi
khỏi u và đi tới v. Hai cạnh (cung) e và e

gọi là kề nhau nếu chúng có đỉnh
chung.
Hai cạnh e, e

cùng nối liền hai đỉnh giống nhau gọi là cạnh kép. Đồ thị
không có cạnh kép gọi là một đơn đồ thị. Trái lại, gọi là đa đồ thị.
Bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc nó, ký hiệu là
ρ(v). Đỉnh có bậc 0 gọi là đỉnh cô lập, đỉnh có bậc 1 gọi là đỉnh treo. Tương
tự, trong đồ thị có hướng ta gọi bậc ra (bậc vào) của đỉnh v là số cung đi
khỏi v (số cung đi tới v), ký hiệu tương ứng là ρ
+
(v) và ρ

(v).
Trong đồ thị vẽ ở Hình 1.2 ta thấy: ρ(9) = 0 nên 9 là đỉnh cô lập;

ρ(1) = ρ(5) = 1 nên 1 và 5 là đỉnh treo; ρ(2) = ρ(3) = ρ(4) = ρ(6) =
ρ(7) = ρ(8) = 2.
Dễ chứng minh các tính chất sau đây về bậc của đỉnh trong đồ thị.
Mệnh đề 1.1. a) Trong đồ thị vô hướng, tổng bậc của mọi đỉnh bằng hai
lần số cạnh của đồ thị và số đỉnh có bậc lẻ bao giờ cũng là một số chẵn.
5
b) Trong đồ thị có hướng, tổng các bậc vào của mọi đỉnh bằng tổng các
bậc ra (của mọi đỉnh) và bằng tổng số cung của đồ thị.
Nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng các cung
trong đồ thị. Vì thế, khi bỏ qua hướng trên các cung (đổi cung thành cạnh)
ta sẽ nhận được một đồ thị vô hướng, gọi là đồ thị nền của đồ thị có hướng
đã cho.
Đồ thị con hay đồ thị bộ phận của một đồ thị G là đồ thị nhận được
từ G bằng cách bỏ đi một số đỉnh và một số cạnh của nó. Nói chính xác,
H = (V (H), E(H)) là một đồ thị con của G nếu V (H) ⊆ V (G) và E(H) ⊆
E(G). Ta nói H là đồ thị con cảm sinh của đồ thị G nếu V (H) ⊆ V (G)
và E (H) = {(x, y) ∈ E (G) : x, y ∈ V (H)}. Đồ thị con H của G gọi là đồ
thị con bao trùm nếu V (H) = V (G). Một đồ thị có đỉnh, nhưng không có
cạnh nào gọi là một đồ thị rỗng.
Với đồ thị vô hướng G và X, Y ⊆ V (G) ta định nghĩa:
E(X, Y ) = {(x, y) ∈ E(G) : x ∈ X\Y, y ∈ Y \X}.
Với đồ thị vô hướng G và X ⊆ V (G) ta định nghĩa:
δ (X) = E (X, V (G) \X).
Tập đỉnh láng giềng của X ký hiệu là:
N (X) = {v ∈ V (G) \X : E (X, {v}) = ∅}.
1.1.2 Đường và chu trình trong đồ thị vô hướng
Đường P từ đỉnh u tới đỉnh v là một dãy liên tiếp các cạnh có dạng:
(a
0
, a

1
), (a
1
, a
2
), , (a
k−1
, a
k
) với (a
i−1
, a
i
) ∈ E(G), a
0
= u, a
k
= v và k  1,
trong đó các đỉnh a
0
, a
1
, , a
k
đều khác nhau. Để đơn giản, ta viết P =
{a
0
, a
1
, , a

k
} và nói đó là đường nối đỉnh u và đỉnh v. Đỉnh u gọi là đỉnh
đầu, đỉnh v gọi là đỉnh cuối của P. Một đường nối một đỉnh tới chính nó
(đỉnh đầu trùng với đỉnh cuối) gọi là một chu trình. Độ dài của đường (chu
trình) là số cạnh của đường (chu trình) đó.
Ví dụ 1.1. Với đồ thị vẽ ở Hình 1.1, một đường nối đỉnh 1 và đỉnh 6 là:
(1, 4), (4, 5), (5, 6) hay đơn giản là 1, 4, 5, 6. Hai đường khác từ 1 đến 6 là
1, 3, 4, 5, 6 và 1, 2, 3, 5, 6, Đồ thị này có các chu trình sau:
6
(1, 2), (2, 3), (3, 1); (1, 4), (4, 5), (5, 3), (3, 1);
Đường và chu trình trong đồ thị có hướng được định nghĩa tương tự (cung
thay cho cạnh). Để phân biệt, đôi khi ta gọi đó là đường (chu trình) định
hướng. Đồ thị có hướng ở Hình 1.3 có các đường định hướng từ đỉnh 1 tới
đỉnh 6 là: 1, 3, 6; 1, 3, 4, 6; 1, 3, 5, 6; 1, 2, 4, 6 Đồ thị đó không có chu
trình định hướng.
1.1.3 Rừng và cây
Một đồ thị vô hướng gọi là liên thông nếu có đường đi nối hai đỉnh bất kỳ
của đồ thị. Trái lại, đồ thị gọi là không liên thông. Đồ thị không liên thông
sẽ bị tách thành một số đồ thị con liên thông, đôi một không có đỉnh chung.
Mỗi đồ thị con liên thông như thế gọi là một thành phần liên thông. Đôi khi
ta đồng nhất thành phần liên thông với tập đỉnh của nó. Tập đỉnh X được
gọi là liên thông nếu đồ thị con sinh bởi X là liên thông. Cạnh e gọi là một
cầu nếu loại bỏ e thì đồ thị tăng số thành phần liên thông.
Ví dụ 1.2. Đồ thị vẽ ở Hình 1.1 là liên thông, trong khi đồ thị vẽ ở Hình
1.2 là không liên thông (gồm 3 thành phần liên thông: {1, 2, 3, 4, 5}; {6, 7, 8};
{9}).
Mệnh đề 1.2. Đồ thị vô hướng G là liên thông khi và chỉ khi δ (X) = ∅ với
mọi ∅ = X ⊂ V (G).
Một đồ thị vô hướng không chứa chu trình gọi là một rừng. Một rừng liên
thông gọi là một cây. Rừng có thể gồm nhiều thành phần liên thông khác

nhau, mỗi thành phần liên thông là một cây. Như vậy, rừng có thể gồm nhiều
cây. Đỉnh có bậc 1 trong cây gọi là một lá.
a. Rừng (không liên thông) b. Cây (liên thông) c. Đồ thị hình sao
Đồ thị hình sao là một cây có nhiều nhất một đỉnh không phải là lá. Một
đồ thị con, không chứa chu trình của đồ thị G gọi là một cây của G. Một đồ
thị con bao trùm của G mà là một cây được gọi là cây bao trùm của G.
7
Sau đây là các tính chất đặc trưng của một cây:
Mệnh đề 1.3. Cho đồ thị vô hướng n đỉnh G. Các điều sau tương đương:
a. G là một cây (tức là G là đồ thị liên thông, không có chu trình);
b. G không có chu trình và có n −1 cạnh;
c. G liên thông và có n −1 cạnh;
d. Mỗi cạnh của G là một cầu;
e. G là đồ thị tối tiểu có δ (X) = ∅ với mọi ∅ = X ⊂ V (G);
f. Khi thêm vào G một cạnh bất kỳ sẽ tạo nên một chu trình duy nhất;
g. G chứa đường duy nhất nối hai đỉnh bất kỳ.
1.1.4 Một số dạng đồ thị đặc biệt
Ngoài rừng, cây và đồ thị hình sao, ta nêu thêm hai dạng đồ thị đặc biệt
hay gặp trong nhiều ứng dụng.
Đồ thị đầy đủ là đơn đồ thị vô hướng mà giữa hai đỉnh bất kỳ của nó luôn
có một cạnh nối. Đồ thị đầy đủ n đỉnh ký hiệu là K
n
và có tất cả n(n −1)/2
cạnh. Các đồ thị đầy đủ K
3
, K
4
và K
5
vẽ ở Hình 1.4.

Hình 1.4: Đồ thị đầy đủ
Đơn đồ thị vô hướng G = (V, E) gọi là đồ thị hai phần nếu có thể phân
hoạch tập đỉnh V = A ∪B (A ∩B = ∅) sao cho cả hai đồ thị con sinh bởi A
và B đều là đồ thị rỗng, tức là G chỉ có các cạnh nối một đỉnh nào đó trong
A với một đỉnh nào đó trong B. Ta viết G = (A ∪B, E) để chỉ đồ thị hai
phần với tập đỉnh A ∪ B. Cách phân tích một đồ thị thành hai phần có thể
không duy nhất.
Hình 1.5 nêu hai ví dụ về đồ thị hai phần. Mặc dù có thể không dễ dàng
nhận ra ngay ví dụ thứ hai. Nhưng nếu đặt A = {1, 2, 3, 4} và B = {5, 6, 7, 8}
thì rõ ràng đó là một đồ thị hai phần.
8
Hình 1.5: Đồ thị hai phần
Mệnh đề sau đây nêu một tính chất đặc trưng của đồ thị hai phần:
Mệnh đề 1.4. Đơn đồ thị G là đồ thị hai phần khi và chỉ khi mọi chu trình
trong G đều có độ dài chẵn.
Dựa vào mệnh đề trên, để kiểm tra xem một đơn đồ thị liên thông đã cho
G = (V, E) có phải là đồ thị hai phần hay không, ta có thể áp dụng thủ tục
sau: Xét đỉnh bất kỳ v ∈ V . Đặt X = {v}, Y = {u ∈ V : (u, v) ∈ E} (tập
đỉnh kề v).
a) Ký hiệu S = {u ∈ V \X : ∃w ∈ Y : (u, w) ∈ E} là tập các đỉnh (không
thuộc X) kề với một đỉnh nào đó thuộc Y . Nếu thấy Y ∩S = ∅ thì G không
phải là đồ thị hai phần: dừng kiểm tra. Trái lại, đặt X := X ∪S.
b) Ký hiệu T = {u ∈ V \Y : ∃w ∈ X : (u, w) ∈ E} là tập các đỉnh (không
thuộc Y ) kề với một đỉnh nào đó thuộc X. Nếu thấy X ∩T = ∅ thì G không
phải là đồ thị hai phần: dừng kiểm tra. Trái lại, đặt Y = Y ∪T .
Tiếp tục quá trình trên cho tới khi phát hiện đồ thị không phải là hai
phần hoặc đã xét hết mọi đỉnh của đồ thị (S = ∅ hay T = ∅). Trong trường
hợp sau, ta kết luận đồ thị là hai phần.
Đồ thị hai phần G = (A ∪ B, E) với |A| = m, |B| = n và E =
{(a, b) : a ∈ A, b ∈ B} được gọi là đồ thị hai phần đầy đủ và ký hiệu là

K
m,n
. Đồ thị này có m.n cạnh. Hình 1.6 nêu một vài ví dụ về đồ thị hai phần
đầy đủ: K
2,3
, K
3,3
, K
3,4
.
Hình 1.6: Đồ thị hai phần đầy đủ
9
1.1.5 Khái niệm mạng
Trong nhiều ứng dụng ta thường quan tâm tới các mạng, tức là các đồ thị
mà trên các cạnh hay cung của nó có các luồng vật chất di chuyển. Chẳng
hạn, mạng lưới giao thông, mạng thông tin liên lạc, mạng phân phối điện,
mạng ống dẫn dầu, mạng cấp nước thành phố,
Có thể hiểu mạng là một đồ thị liên thông (vô hướng hay có hướng) mà
trên mỗi cạnh hay cung của đồ thị có gắn một số không âm, gọi là năng
lực lưu thông của cạnh hay cung đó. Năng lực lưu thông của cạnh hay cung
cho biết lượng vật chất tối đa có thể di chuyển trên cạnh hay cung đó (tấn/
giờ đối với mạng ống dẫn dầu, m
3
/ phút đối với mạng cấp nước thành phố,
xung/ giây đối với mạng thông tin liên lạc, số xe/ giờ đối với mạng giao
thông thành phố).
Các đỉnh trong mạng có thể biểu diễn các kho chứa hàng, các đài tiếp âm,
các nút giao thông hay các trạm bơm,
Nếu không có hạn chế đối với lượng vật chất di chuyển từ đỉnh i tới đỉnh
j trong mạng thì năng lực lưu thông d

ij
đặt bằng một số khá lớn, ký hiệu
Gz. Còn nếu không có cạnh hay cung nối hai đỉnh i và j thì đặt năng lực
lưu thông d
ij
= 0. Ma trận lập nên từ các hệ số năng lực lưu thông của các
cạnh hay cung trong mạng gọi là ma trận năng lực lưu thông của mạng.
1.2 Biểu diễn đồ thị và tìm kiếm trên đồ thị
1.2.1 Cách biểu diễn đồ thị
• Ma trận kề. Cho đồ thị G = (V, E), với tập đỉnh V = {v
1
, v
2
, , v
n
}.
Ma trận kề của đồ thị G được định nghĩa là ma trận M = [m
ij
] với
m
ij
=

1 nếu đỉnh i kề đỉnh j
0 nếu đỉnh i không kề đỉnh j
Cũng có thể dùng ma trận kề để biểu diễn đồ thị có hướng: m
ij
= 1 nếu
có cung đi từ i tới j. Ma trận kề của đồ thị vô hướng là đối xứng, nhưng
ma trận kề của đồ thị có hướng nói chung không đối xứng. Ví dụ, đồ thị vô

hướng vẽ ở Hình 1.1 và đồ thị có hướng vẽ ở Hình 1.3 có các ma trận kề lần
10
lượt là:
M =








0 1 1 1 0 0 0
1 0 1 0 0 0 0
1 1 0 1 1 0 0
1 0 1 0 1 0 1
0 0 1 1 0 1 0
0 0 0 0 1 0 0
0 0 0 1 0 0 0








và N =







0 1 1 0 0 0
0 0 1 1 0 0
0 0 0 1 1 1
0 0 0 0 0 1
0 0 0 0 0 1
0 0 0 0 0 0






Dễ thấy rằng tổng các phần tử trên hàng i (cột j) bất kỳ của ma trận kề
bằng bậc hay bậc ra của đỉnh i (bậc hay bậc vào của đỉnh j).
Một mạng có thể được biểu diễn bằng ma trận năng lực lưu thông của
nó. Đó là sự mở rộng khái niệm ma trận kề của đồ thị. Đồ thị có hướng vẽ ở
Hình 1.3 sẽ trở thành một mạng nếu nó được gắn với một ma trận năng lực
lưu thông, chẳng hạn:
D =






0 7 5 0 0 0

0 0 2 3 0 0
0 0 0 6 4 8
0 0 0 0 0 2
0 0 0 0 0 6
0 0 0 0 0 0






• Danh sách cạnh (cung). Trường hợp đồ thị thưa (ví dụ, số cạnh m
 6 lần số đỉnh n) ta dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh
(cung).
Trong cách biểu diễn này mỗi cạnh (cung) e = (x, y) của đồ thị sẽ được
lưu giữ nhờ hai biến nguyên Dau(e), Cuoi(e). Nhược điểm của cách biểu diễn
này là khó xác định các đỉnh của đồ thị kề với một đỉnh cho trước.
Danh sách cạnh (cung) của đồ thị vẽ ở Hình 1.1 (Hình 1.3) như sau:
Danh sách cạnh Danh sách cung
Đầu Cuối Đầu Cuối
1 2 1 2
1 3 1 3
1 4 2 3
2 3 2 4
3 4 3 4
3 5 3 5
4 5 3 6
4 7 4 6
5 6 5 6
• Danh sách kề. Trong nhiều ứng dụng 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 và hay được
11
dùng nhất. Theo cách biểu diễn này, ứng với mỗi đỉnh u của đồ thị ta sẽ lưu
giữ danh sách các đỉnh kề u: Ke(u) = {v ∈ V (G) : (u, v) ∈ E (G)}
Ví dụ 1.3. Danh sách kề của đồ thị ở Hình 1.1 và 1.3 là (0 chỉ hết danh
sách):
Đồ thị vô hướng Đồ thị có hướng
Đỉnh Danh sách kề Đỉnh Danh sách kề
1 2 3 4 0 1 2 3 0
2 1 3 0 2 3 4 0
3 1 2 4 5 0 3 4 5 6 0
4 1 3 5 7 0 4 6 0
5 3 4 6 0 5 6 0
6 5 0 6 0
7 4 0
• Ma trận liên thuộc. Cùng với ma trận kề, đồ thị vô hướng còn có thể
được biểu diễn bởi ma trận B = [b
ve
]
n.m
, trong đó n là số đỉnh, m là số cạnh
của đồ thị, gọi là ma trận liên thuộc đỉnh - cạnh với
b
ve
=

1 nếu đỉnh v liên thuộc cạnh e
0 nếu đỉnh v không liên thuộc cạnh e
Với đồ thị có hướng thì b
ve

= 1 nếu v là đỉnh đầu của cung e và b
ve
= 0
nếu v không phải là đỉnh đầu của e. Ví dụ, đồ thị vô hướng vẽ ở Hình 1.1
và đồ thị có hướng vẽ ở Hình 1.3. có các ma trận liên thuộc đỉnh - cạnh lần
lượt là:
cạnh e
12
e
13
e
14
e
23
e
34
e
35
e
45
e
47
e
56
e
12
e
13
e
23

e
24
e
34
e
35
e
36
e
46
e
56
M =








1 1 1 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0
0 1 0 1 1 1 0 0 0
0 0 1 0 1 0 1 1 0
0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0









và N =






1 1 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0
0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0






1.2.2 Các thuật toán tìm kiếm trên đồ thị
Các thuật toán cho phép duyệt một cách có hệ thống mọi đỉnh của đồ thị
gọi là các thuật toán tìm kiếm trên đồ thị. Có hai thuật toán tìm kiếm phổ
biến trên đồ thị. Đó là:
12

• Tìm kiếm theo chiều sâu (DFS = Depth-First Search). Ý tưởng thuật
toán: Bắt đầu từ một đỉnh v
0
nào đó của đồ thị, gọi là đỉnh gốc: Tiến hành
"xét" đỉnh v
0
(ví dụ in ra tên đỉnh, gán nhãn cho đỉnh, ). Tiếp đó, chọn
một đỉnh u là đỉnh (chưa xét) tuỳ ý kề v
0
và tiếp tục quá trình tìm kiếm từ
đỉnh u (như đã làm đối với v
0
). Nói chung, khi đang ở đỉnh v, nếu trong số
các đỉnh kề v tìm được đỉnh w (chưa xét) thì ta tiếp tục quá trình tìm kiếm
từ đỉnh w này. Còn nếu mọi đỉnh kề v đều đã được xét thì đỉnh v xem như
đã được xét (duyệt) xong và ta tiếp tục tìm kiếm từ một đỉnh mà trước đây
từ đỉnh đó ta đã tới v, nếu v = v
0
(đỉnh gốc) hoặc dừng quá trình tìm kiếm
nếu v = v
0
.
Khi dừng quá trình tìm kiếm từ đỉnh gốc v
0
, ta đã duyệt tất cả các đỉnh
ở trên cùng một thành phần liên thông với v
0
. Nếu sau đó trong đồ thị vẫn
còn đỉnh chưa xét thì ta lại chọn một đỉnh trong số đó làm đỉnh gốc và lặp
lại quá trình tìm kiếm như đã mô tả ở trên.

Quá trình tìm kiếm theo chiều sâu sẽ tạo ra một đồ thị con gọi là rừng
(gồm nhiều cây với gốc khác nhau) tối đại. Đó là tập hợp tất cả các cạnh
mà từ đó đã dẫn đến phát hiện đỉnh mới trong quá trình tìm kiếm. Rừng
này được gọi là rừng DFS. Đó là đồ thị con F của đồ thị đã cho G sao cho
trong F không có chu trình và khi thêm vào F một cạnh bất kỳ của G không
thuộc F sẽ tạo nên với các cạnh thuộc F một chu trình duy nhất. Rừng DFS
có thể thu được trong quá trình tìm kiếm DFS nhờ dùng cái gọi là "con trỏ
cha", trỏ tới đỉnh mà từ đó đã dẫn tới đỉnh được xét trong quá trình tìm
kiếm. Các đỉnh gốc của mỗi thành phần liên thông trong F có con trỏ cha
bằng Nil (rỗng - không trỏ vào đâu cả).
Hình 1.7: Tìm kiếm theo chiều sâu: a, Đồ thị ban đầu; b, Rừng DFS
Hình 1.7 vẽ đồ thị gồm hai thành phần liên thông. Quá trình tìm kiếm
13
theo chiều sâu (DFS) bắt đầu từ đỉnh 1 và tiến hành duyệt các đỉnh của đồ
thị theo thứ tự: 1, 2, 4, 3, 5, 6. Sau đó quá trình tìm kiếm tiếp tục với các
đỉnh 7, 8, 9. Rừng DFS gồm các cạnh liền nét.
• Tìm kiếm theo chiều rộng (BFS = Breadth-First Search). Để ý rằng
trong thuật toán tìm kiếm theo chiều sâu, đỉnh được thăm càng muộn sẽ
càng sớm trở thành đã duyệt xong. Điều đó có nghĩa là các đỉnh được thăm
sẽ được đặt vào trong một cấu trúc dữ liệu kiểu "ngăn xếp - stack" (giống
như khi xếp đĩa: đĩa được xếp sau ở phía trên và đĩa trên cùng sẽ được lấy
ra trước). Thuật toán tìm kiếm theo chiều rộng trên đồ thị được xây dựng
trên cơ sở thay thế cấu trúc ngăn xếp bởi cấu trúc dữ liệu kiểu "hàng đợi
- queue" (giống như khi xếp hàng: người xếp hàng tiếp theo phải đứng vào
cuối hàng và người đứng đầu hàng sẽ được gọi trước). Với cách tìm kiếm này,
đỉnh được thăm càng sớm sẽ sớm trở thành đã duyệt xong (sớm dời khỏi
hàng đợi). Một đỉnh sẽ trở thành đã duyệt xong ngay sau khi đã duyệt xong
tất cả các đỉnh kề nó.
Quá trình tìm kiếm theo chiều rộng (BFS) bắt đầu từ một đỉnh v được
chọn tuỳ ý, gọi là đỉnh gốc. Đỉnh này được đưa ngay vào hàng đợi. Lúc này

mọi đỉnh của đồ thị đều chưa được xét và hàng đợi gồm duy nhất đỉnh v đã
chọn. Nói chung, khi hàng đợi khác rỗng, các đỉnh trong hàng đợi sẽ được
xét theo thứ tự "đến trước - xét trước", gọi là thứ tự FIFO (First In - First
Out). Khi xét một đỉnh, ngoài các thao tác có thể làm (in ra tên đỉnh, gán
nhãn cho đỉnh, ) ta cần đưa vào hàng đợi tất cả các đỉnh chưa xét, kề với
đỉnh đó (nếu có), ví dụ theo thứ tự đỉnh đã ghi trong danh sách kề. Sau đó,
đỉnh đang xét xem như đã xét (duyệt) xong và bị loại ra khỏi hàng đợi. Tiếp
tục quá trình tìm kiếm trên đây từ đỉnh ở đầu hàng đợi cho tới khi hàng đợi
trở nên rỗng.
Có thể thấy quá trình tìm kiếm theo chiều sâu sẽ cho phép duyệt tất cả
các đỉnh của đồ thị thuộc cùng thành phần liên thông với đỉnh gốc v. Nếu
sau đó trong đồ thị vẫn còn đỉnh chưa xét thì ta lại chọn một đỉnh trong số
đó làm đỉnh gốc và lặp lại quá trình tìm kiếm mô tả ở trên. Quá trình tìm
kiếm theo chiều rộng cũng sẽ tạo ra một rừng tối đại, bao gồm tất cả các
cạnh mà từ đó đã dẫn đến các đỉnh được đưa vào hàng đợi trong quá trình
tìm kiếm. Rừng này được gọi là rừng BFS.
Xét đồ thị vẽ ở Hình 1.8. Quá trình tìm kiếm theo chiều rộng (BFS) bắt
14
đầu từ đỉnh 1. Các đỉnh của đồ thị được duyệt theo thứ tự: 1, 2, 3, 4, 6, 5
(lần lượt đứng ở đầu hàng đợi). Rừng BFS gồm các cạnh liền nét (dùng con
trỏ cha).
Hình 1.8: Tìm kiếm theo chiều rộng: a, Đồ thị ban đầu; b, Rừng BFS
Sau đây là một tính chất đáng chú ý của rừng BFS: Giả sử s là đỉnh gốc
của một thành phần liên thông nào đó trong rừng BFS. Khi đó, đường gồm
các cạnh thuộc rừng nối s với một đỉnh t bất kỳ thuộc thành phần liên thông
này là đường có số cạnh ít nhất trong số tất cả các đường trong G nối s với
t.
Độ phức tạp tính toán của cả hai thuật toán tìm kiếm đã nêu bằng
O(m + n) = O(m), trong đó m = |E(G)| là số cạnh và n = |V (G)| là
số đỉnh của đồ thị G.

Tóm lại, chương này đã đề cập tới những khái niệm cơ bản về đồ thị. Cụ
thể, đã trình bày và giải thích bằng ví dụ các khái niệm về đồ thị (vô hướng,
có hướng) và mạng, đỉnh và cạnh (cung), đường và chu trình trong đồ thị,
đồ thị liên thông, không liên thông. Miêu tả nhiều dạng đồ thị khác nhau:
đồ thị con (con cảm sinh, con bao trùm) của một đồ thị và các dạng đồ thị
đặc biệt: rừng và cây, đồ thị hình sao, đồ thị đầy đủ, đồ thị hai phần. Cách
biểu diễn đồ thị (ma trận kề, ma trận liên thuộc, danh sách cạnh, danh sách
kề). Hai cách tìm kiếm trên đồ thị (theo chiều rộng BFS và chiều sâu DFS)
rất đáng được quan tâm.
15
Chương 2
Bài toán ghép cặp trên đồ thị
Chương này sẽ đề cập tới bài toán ghép cặp cực đại, ghép cặp hoàn hảo
trên đồ thị. Các bài toán này có nhiều ứng dụng trong thực tiễn: phân việc,
xếp lịch, cấu trúc liên kết hoá học, . . . Ta sẽ tìm hiểu các điều kiện cần và
đủ để một đồ thị có ghép cặp cực đại, ghép cặp hoàn hảo và trình bày các
thuật toán giải các bài toán. Nội dung của chương được tham khảo chủ yếu
từ các tài liệu [2], [4] và [5].
2.1 Ghép cặp hoàn hảo và ghép cặp cực đại
Trước hết ta làm quen với một số khái niệm cơ bản về bài toán này.
Định nghĩa 2.1. Cho một đồ thị vô hướng G với tập cạnh E (G). Ta gọi tập
cạnh con M ⊆ E (G) là một ghép cặp (matching) của G nếu hai cạnh bất kỳ
của M không có chung đỉnh. Ghép cặp M gọi là tối đại (maximal matching)
nếu M ⊂ M

với mọi ghép cặp M

của G (M không là tập con thực sự của bất
kỳ ghép cặp khác của G). Ghép cặp M gọi là cực đại (maximum matching)
nếu |M| 



M



với mọi ghép cặp M

của G, tức là M gồm nhiều cạnh nhất.
Rõ ràng, một ghép cặp cực đại cũng là ghép cặp tối đại, nhưng ngược lại
nói chung không đúng.
Cho đồ thị G và ghép cặp M của G. Cạnh e ∈ M gọi là cạnh ghép, cạnh
e /∈ M gọi là cạnh tự do. Đỉnh liên thuộc một cạnh ghép nào đó gọi là đỉnh
bị phủ bởi M, đỉnh không liên thuộc cạnh ghép nào gọi là đỉnh tự do hay
đỉnh không bị phủ bởi M. Ghép cặp M gọi là hoàn hảo (perfect matching)
nếu mọi đỉnh của đồ thị đều bị phủ bởi M. Một ghép cặp hoàn hảo là một
ghép cặp cực đại, nhưng ngược lại nói chung không đúng.
16
Định nghĩa 2.2. Bài toán tìm một ghép cặp của G có số cạnh lớn nhất (ghép
cặp cực đại) gọi là bài toán ghép cặp cực đại (cardinality matching problem).
Hình vẽ dưới đây minh họa cho các khái niệm này. Các cạnh {(2, 4) , (3, 5)}
tạo nên một ghép cặp tối đại trong đồ thị. Các đỉnh ➁, ➂, ➃ và ➄ bị phủ
bởi M. Các đỉnh ➀, ➅ là đỉnh tự do (không bị phủ bởi M). Mỗi ghép cặp
có nhiều nhất [n/2] cạnh.
Hình 2.1: Ghép cặp.
cạnh ghép
cạnh tự do
Bài toán ghép cặp theo trọng số: Khi mỗi cạnh của đồ thị có gắn với một
số thực (gọi là trọng số của cạnh) thì ta có thể xét bài toán mở rộng sau, gọi
là bài toán ghép cặp theo trọng số (maximum weighted matching problem):

Tìm ghép cặp của đồ thị sao cho tổng trọng số các cạnh ghép là lớn nhất.
Bài toán ghép cặp cực đại nêu trong định nghĩa 2.2. là một trường hợp riêng
của bài toán ghép cặp theo trọng số, với trọng số mỗi cạnh bằng 1.
Bài toán ghép cặp theo trọng số trên đồ thị hai phần (còn gọi là bài toán
phân việc) sẽ được trình bày ở chương 3. Bài toán ghép cặp theo trọng số
trên đồ thị bất kỳ là một bài toán tối ưu tổ hợp "khó nhất" trong số các bài
toán tối ưu có thể giải được trong thời gian đa thức.
Tuy không quá phức tạp, nhưng bài toán ghép cặp cực đại cũng đã có
những ứng dụng đa dạng trong thực tiễn, một số ứng dụng đáng chú ý của
bài toán này được đề cập ở chương sau cùng với bài toán phân việc.
Tiếp theo, ta đề cập tới hai khái niệm quan trọng: đường đan và đường
cải tiến. Chúng được dùng nhiều trong các thuật toán về ghép cặp trên đồ
thị.
Định nghĩa 2.3. Cho đồ thị G bất kỳ và M là một ghép cặp trong G. Một
đường P = i
1
−i
2
−. . .−i
k
trong G gọi là đường đan với M (M - alternating
path) nếu mỗi cặp cạnh liên tiếp trong P chứa một cạnh ghép và một cạnh
tự do, nghĩa là P gồm các cạnh xen kẽ thuộc M và không thuộc M.
17
Trong Hình 2.1 ta thấy 1 - 2 - 4 - 3 - 5 và 1 - 2 - 4 - 3 - 5 - 6 là các đường
đan.
Đường đan (với M) gọi là chẵn (lẻ) nếu nó chứa một số chẵn (lẻ) cạnh.
Một đường đan khép kín gọi là một chu trình đan. Chu trình đan bao giờ
cũng chứa một số chẵn cạnh. Trong ví dụ xét trên, đường đan thứ nhất là
chẵn, đường đan thứ hai là lẻ, còn 3 - 2 - 4 - 5 - 3 là một chu trình đan (gồm

4 cạnh).
Định nghĩa 2.4. Đường đan với M gọi là đường cải tiến đối với M (M
- augmenting path) nếu đỉnh đầu và đỉnh cuối của nó không bị phủ bởi M
(đỉnh tự do).
Có thể thấy đường cải tiến (đối với M) phải là đường đan lẻ. Ta gọi đó
là đường cải tiến, bởi vì bằng cách đổi các cạnh ghép trên đường này thành
cạnh tự do và ngược lại, ta nhận được một ghép cặp mới có |M| + 1 cạnh
(nhiều hơn ghép cặp cũ một cạnh). Chẳng hạn, ở Hình 2.1, 1 - 2 - 4 - 3 - 5
- 6 là đường cải tiến đối với ghép cặp gồm 2 cạnh (tô đậm) và sau khi tráo
đổi cạnh ghép với cạnh tự do trên đường này, ta nhận được ghép cặp mới
{(1, 2) , (3, 4) , (5, 6)} (Hình 2.2).
Sau cùng, ta cần đến khái niệm hiệu đối xứng (Hình 2.3) của hai tập hợp.
Định nghĩa 2.5. Cho hai tập hợp S
1
và S
2
.Hiệu đối xứng của hai tập này,
ký hiệu S
1
∆S
2
, là tập S
1
∆S
2
= (S
1
∪ S
2
) \(S

1
∩ S
2
). Nói cách khác, hiệu
đối xứng của tập S
1
và tập S
2
gồm tất cả các phần tử chỉ thuộc một trong
hai tập đó.
Ví dụ, S
1
= {3, 4, 6, 7} và S
2
= {2, 3, 7, 8, 9} thì S
1
∆S
2
= {2, 4, 6, 8, 9}.
Khái niệm hiệu đối xứng của hai tập có vai trò quan trọng trong lý thuyết
ghép cặp. Ta còn gặp phép toán này ở các phần tiếp theo của chương.
Có thể thấy rằng nếu M là một ghép cặp và P là đường cải tiến (đối
với M ) thì hiệu đối xứng M

= M∆E(P ) là một ghép cặp với số cạnh


M




= |M|+ 1. Hơn nữa, trong ghép cặp M

các đỉnh bị phủ (bởi M) vẫn
còn bị phủ (bởi M

) và có thêm hai đỉnh (đỉnh đầu và đỉnh cuối của P) bị
phủ (bởi M

).
18
Hình 2.2: Ghép cặp mới M

Hình 2.3: Hiệu đối xứng
Định lý sau làm cơ sở lý luận cho nhiều thuật toán ghép cặp.
Định lý 2.1 (Berge, 1957). Cho đồ thị G bất kỳ (hai phần hay không) và
ghép cặp M trong G. M là ghép cặp cực đại trong G khi và chỉ khi không có
đường cải tiến nào đối với M.
Chứng minh. Nếu P là một đường cải tiến (đối với M) thì hiệu đối xứng
M∆E(P)(nhận được bằng cách đổi các cạnh ghép trên P thành cạnh tự do
và ngược lại) cũng là một ghép cặp và có số cạnh nhiều hơn |M|, vì thế M
không thể là ghép cặp cực đại.
Ngược lại, nếu có ghép cặp M

với


M




> |M| thì hiệu đối xứng M∆M

là hợp của các chu trình và đường đan (xen kẽ các cạnh thuộc M và M

)
rời nhau (không có đỉnh chung). Thật vậy, xét đồ thị H nhận được từ G
bằng cách bỏ đi các cạnh /∈

M\M


∪ (M

\M). Khi đó, mỗi đỉnh v thuộc
H có bậc  2, bởi vì trong H có nhiều nhất hai cạnh, một thuộc M và một
thuộc M

, liên thuộc v. Vì thế, mỗi thành phần liên thông của H phải là
một đường hay một chu trình. Mỗi chu trình trong H phải có độ dài chẵn,
vì nếu khác đi thì có hai cạnh thuộc M(hay M

) cùng kề với một đỉnh trên
chu trình và như thế sẽ trái với giả thiết M(hay M

) là ghép cặp trong G.
H có thể có 5 loại thành phần liên thông khác nhau (Hình 2.4, cạnh nét liền
∈ M, cạnh nét đứt ∈ M

):

➊ Một đỉnh cô lập.
➋ Chu trình đan độ dài chẵn ( 4).
➌ Đường đan độ dài chẵn.
➍ Đường đan độ dài lẻ bắt đầu và kết thúc ở đỉnh bị phủ bởi M.
➎ Đường đan độ dài lẻ bắt đầu và kết thúc ở đỉnh bị phủ bởi M

.
19
Hình 2.4: Các thành phần liên thông trong H.
Trong 5 thành phần liên thông kể trên, chỉ có hai thành phần ➍ và ➎ là
có số cạnh nét liền và nét đứt khác nhau. Đồng thời, ➎ là thành phần duy
nhất có nhiều cạnh thuộc M

hơn thuộc M. Do


M



> |M| nên số cạnh nét
đứt phải nhiều hơn số cạnh nét liền. Vì thế, trong H phải có ít nhất một
thành phần liên thông loại ➎ (thực ra số thành phần loại ➎ nhiều hơn số
thành phần loại ➍ ít nhất là một). Vậy, nếu H có dù chỉ một thành phần
liên thông loại ➎ thì ta cũng đã có một đường cải tiến (đối với M) trong
G.
Chú ý 2.1. Ghép cặp cực đại trong một đồ thị có thể không duy nhất.
Định lý Berge gợi ý cách tìm ghép cặp cực đại trên đồ thị như sau: Xuất
phát từ ghép cặp tuỳ ý M (có thể M = ∅). Tìm đường cải tiến P (đối
với M) đi từ một đỉnh tự do tới một đỉnh tự do khác. Nếu thấy P thì đặt

M ← M∆E(P ). Tiếp tục tìm đường cải tiến. Nếu không tìm thấy P thì
dừng: M là ghép cặp cực đại.
Để tìm đường cải tiến có thể dùng ý tưởng sau: Lấy một đỉnh tự do làm
gốc của cây tìm kiếm DFS. Khi tìm kiếm ta luôn theo dõi khoảng cách (= số
cạnh) từ một đỉnh tới gốc của cây. Để mở rộng cây DFS ta dùng một cạnh
∈ M nếu đỉnh đang xét có khoảng cách lẻ hoặc một cạnh /∈ M, nếu trái lại.
Khi tìm ra một đỉnh tự do kề một đỉnh có khoảng cách (tới gốc) chẵn thì ta
đã có một đường cải tiến.
Tuy nhiên, cách này không bảo đảm tìm ra đường cải tiến ngay cả khi nó
có. Xét đồ thị vẽ ở Hình 2.5. Ta chọn ➏ làm gốc của cây tìm theo DFS. Nếu
theo thứ tự ➏ - ➎ - ➍ - ➌ - ➋ - ➊ thì ta tìm được một đường cải tiến. Nhưng
nếu tìm theo trình tự ➏ - ➋ - ➌ - ➍ - ➎ thì ta đã bỏ qua đường cải tiến đó.
20
Hình 2.5: Tìm đường cải tiến theo DFS.
Rắc rối gặp phải là do trong đồ thị có chu trình độ dài lẻ. Trong chu trình
lẻ có hai cạnh tự do liên thuộc một đỉnh. Nếu bắt đầu tìm theo DFS từ đỉnh
này và nếu đi theo hướng "sai" trên chu trình thì có thể ta bỏ lỡ đường cải
tiến. Để khắc phục khó khăn này ở mục 2.2 ta sẽ xét riêng đồ thị hai phần
(không có chu trình độ dài lẻ). Với đồ thị bất kỳ thì cách xử lý sẽ phức tạp
hơn.
2.2 Ghép cặp trong đồ thị hai phần
Trong mục này ta xét bài toán ghép cặp trong đồ thị hai phần. Về mặt
thuật toán, bài toán này có thể quy được về bài toán luồng lớn nhất trên
mạng. Bài toán tìm ghép cặp cực đại trong đồ thị bất kỳ phức tạp hơn và sẽ
là một chủ đề khác.
2.2.1 Điều kiện tồn tại
Sau đây ta giả thiết G liên thông và là đồ thị hai phần với phân hoạch
tập đỉnh V (G) = A∪B. Ký hiệu ν(G) là số cạnh của ghép cặp cực đại trong
G. Ta có:
Định lý 2.2 (Hall, 1935). Cho G là một đồ thị hai phần với phân hoạch

V (G) = A ∪B. Khi đó, G có ghép cặp phủ A khi và chỉ khi
|N(S)|  |S|,
với mọi S ⊆ A, trong đó N(S) ⊆ B là tập các đỉnh kề với một đỉnh nào đó
thuộc S.
Chứng minh. Điều kiện cần. Giả sử M là ghép cặp phủ A. Khi đó, với bất
kỳ tập con S ⊆ A, N(S) luôn chứa mọi đỉnh được ghép cặp với các đỉnh
thuộc S. Vì thế, |N(S)|  |S|.
21
Điều kiện đủ. Giả sử M là một ghép cặp cực đại trong G, không phủ hết
A. Giả sử v là đỉnh tự do trong A (không bị phủ bởi M) và Z là tập tất cả
các đỉnh liên thông với v thông qua các đường đan với M. Rõ ràng, v là đỉnh
tự do duy nhất trong Z (trái lại ta đã có một đường cải tiến, trái với M là
cực đại). Đặt S = Z ∩ A và T = Z ∩ B. Rõ ràng các đỉnh thuộc S − {v}
được ghép cặp với các đỉnh thuộc T . Do đó, |T | = |S| − 1. Thực tế ta có
N(S) = T , vì mỗi đỉnh thuộc N(S) đều liên thông với v qua một đường đan
(với M). Điều này kéo theo |N(S)| < |S|, trái với giả thiết.
Một trường hợp riêng quan trọng của định lý Hall là định lý sau đây:
Định lý 2.3 (Frobenius, 1917). Cho đồ thị hai phần G với phân hoạch tập
đỉnh V (G) = A∪B. Khi đó, G có ghép cặp hoàn hảo khi và chỉ khi |A| = |B|
và |N(S)|  |S| với mọi S ⊆ A.
Định lý Hall có ứng dụng đa dạng trong lý thuyết tổ hợp. Định lý sau cho
thấy có thể giải bài toán ghép cặp trên đồ thị hai phần trong thời gian đa
thức.
Định lý 2.4. Bài toán ghép cặp cực đại (theo số cạnh) trong đồ thị hai phần
có thể giải trong thời gian O(m.n), trong đó n = |V (G)| và m = |E(G)|.
Chứng minh. Cho G là đồ thị hai phần với phân hoạch V (G) = A∪B. Thêm
vào G đỉnh nguồn s và nối s với mọi đỉnh của A; và thêm vào G đỉnh đích t
( t = s ) và nối t với mọi đỉnh của A. Định hướng các cạnh theo chiều từ s
tới A, từ A tới B và từ B tới t. Đặt năng lực lưu thông của mọi cạnh bằng 1.
Ký hiệu G


là đồ thị sau biến đổi (Hình 2.6, 2.7). Đồ thị G

có dạng đặc biệt:
mỗi đỉnh thuộc A có bậc vào bằng 1 và mỗi đỉnh thuộc B có bậc ra bằng 1.
Ta thiết lập sự tương ứng một - một giữa ghép cặp gồm k cạnh trong đồ thị
ban đầu G với luồng nguyên giá trị k (từ s đến t) trong đồ thị mở rộng G

.
Cho ghép cặp M = {(i
1
, j
1
) , (i
2
, j
2
) , . . . , (i
k
, j
k
)} trong G (gồm k cạnh).
Ta xác định luồng trong G

như sau. Trước hết, đặt luồng trên mỗi cạnh
ghép bằng 1. Sau đó để đảm bảo điều kiện cân bằng luồng trong G

, ta đặt
luồng trên các cạnh (s, i
r

) và (j
r
, t) bằng 1 với mọi r = 1, k. Rõ ràng với
cách chọn này, ta nhận được luồng với trị k trong G

từ s đến t.
Ngược lại, cho luồng nguyên giá trị k từ s đến t trong G

. Ta có thể phân
hoạch luồng thành k đường từ s đến t có dạng:

×