You are on page 1of 14

Đồ án Giải thuật & Lập trình

ĐẠI HỌC ĐÀ NẴNG


ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN

GIẢI THUẬT & LẬP TRÌNH


Đề tài: CÂY GOMORY-HU

GIẢNG VIÊN HƯỚNG DẪN : PHẠM MINH TUẤN

NGUYỄN THỊ LỆ QUYÊN

SINH VIÊN THỰC HIỆN : CHÂU THỊ TƯ

NGUYỄN THỊ ANH THƯ


LỚP : 16TCLC3

Đà Nẵng 12-2018

Trang 1
Đồ án Giải thuật & Lập trình

LỜI MỞ ĐẦU
Giải thuật & lập trình là bộ môn quan trọng, là kiến thức căn bản không thể
thiếu của mỗi lập trình viên.
Dựa trên những tài liệu mà mình tìm hiểu, nhóm chúng em đã nghiên cứu
và thực hiện đề tài: Cây Gomory-Hu
Em xin chân thành cảm ơn thầy cô khoa Công Nghệ Thông Tin đã tạo
điều kiện để em nghiên cứu kỹ hơn những kiến thức này, và đặc biệt là thầy
Phạm Minh Tuấn và cô Nguyễn Thị Lệ Quyên đã nhiệt tình theo dõi, hướng dẫn
nhóm chúng em trong quá trình thực hiện đề tài này.
Vì kiến thức còn hạn hẹp, nên không thể tránh khỏi những sai sót trong
quá trình làm đề tài, rất mong nhận được sự góp ý của thầy cô để sản phẩm
được hoàn thiện hơn. Chúng em xin chân thành cảm ơn.

Trang 2
Đồ án Giải thuật & Lập trình

MỤC LỤC
GIỚI THIỆU ĐỀ TÀI 4
ĐỊNH NGHĨA 4
Lát cắt 4
Luồng 5
Luồng cực đại lát cắt cực tiểu 5
Cây Gomory-Hu 5
TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN 5
Phát biểu bài toán 5
Thuật toán 5
BÀI TOÁN ỨNG DỤNG 7
Ưu điểm 13
Nhược điểm 14

Trang 3
Đồ án Giải thuật & Lập trình

1. GIỚI THIỆU ĐỀ TÀI


Cây Gomory-Hu là thuật toán được phát minh bởi Ralph E.Gomory và Te
Chiang Hu vào năm 1961.
Trong tối ưu hoá tổ hợp, cây Gomory-Hu T của một đồ thị vô hướng có trọng
số G là một cây mà biểu thị cho các lát cắt s-t tối thiểu trong đồ thị G cho mỗi
cặp đỉnh s, t tương ứng thuộc cây T. Bằng việc tìm lát cắt nhỏ nhất cho mỗi cặp
cạnh s, t trong đồ thị, tìm trọng số của lát cắt và gán trọng số của lát cắt s-t tối
thiểu cho cặp cạnh s-t trong cây T, chúng ta có thể tìm được một cây có các
luồng cực đại với lát cắt cực tiểu cho mỗi cặp cạnh s-t tương ứng. Cây Gomory-
Hu có thể tính được bằng | V | - 1 lần áp dụng thuật toán tính luồng cực đại.

Đồ thị G Cây Gomory-Hu T

2. ĐỊNH NGHĨA

2.1. Lát cắt


Lát cắt: là cách phân chia các tập hợp đỉnh của một đồ thị thành 2 phần
tập hợp con.
Trọng số của lát cắt (khả năng thông qua của lát cắt): là tổng trọng số
của các cạnh bị lát cắt đó đi qua
Lát cắt s-t: là một cách phân chia đồ thị G sao cho s ∈ S và t ∈ T, (s và t
được gọi là đỉnh phát và đỉnh thu của G).
Lát cắt tối thiểu: là lát cắt s-t sao cho trọng số của lát cắt đó là nhỏ nhất
trong số các lát cắt còn lại.

Trang 4
Đồ án Giải thuật & Lập trình

2.2. Luồng
- Giá trị luồng: là một hàm thực f: V x V → R với các thuộc tính:
o f(u, v) = - f(v, u): Tổng luồng từ u tới v bằng đối tổng luồng từ v
tới u.
o f(u, v) ≤ c(u, v): Luồng dọc theo một cạnh luôn bé hơn hoặc bằng
trọng số (khả năng thông qua) của cạnh đó.
o ∑uf(u→v)=∑wf(v→w): Tổng luồng đi vào v bằng tổng luồng đi ra
khỏi v, ngoại trừ đỉnh phát s và đỉnh thu t.

2.3. Luồng cực đại lát cắt cực tiểu


- Với mọi mạng và 2 điểm đầu cuối s, t giá trị của luồng (s, t) cực đại
bằng khả năng thông qua của lát cắt (s, t) cực tiểu.

2.4. Cây Gomory-Hu


- Cho đồ thị vô hướng có trọng số G = ((VG, EG), c) với c(u,v) là trọng số
của cạnh (u, v) tương ứng
- Đặt λst là trọng số tối thiểu của 1 lát cắt s-t với mỗi s, t ∈ VT.
- Cho T = (VT, ET) là 1 cây với VT=VG , đặt Pst là tập hợp các cạnh mà s-t
cắt ngang qua với mỗi s, t ∈ VT
- Khi đó, T sẽ là cây Gomory-Hu của đồ thị G nếu:
- λst = mine∈Pst c(Ue, Ve) với mọi s, t ∈ VG
Khi:
o Ue và Ve là 2 thành phần được kết nối của T∖{e} với (Ue, Ve) trong
T là lát cắt s-t trong G
o c(Ue, Ve) là trọng số của lát cắt trong G.

3. TỔ CHỨC CẤU TRÚC DỮ LIỆU VÀ THUẬT TOÁN

3.1. Phát biểu bài toán


Input : Đồ thị vô hướng có trọng số G = ((VG, EG), c)
Output : Cây Gomory-Hu T=((VT, ET), c)

3.2. Thuật toán


- Có thể được tính bởi |V| - 1 lần áp dụng tính toán luồng cực đại.

Trang 5
Đồ án Giải thuật & Lập trình

- Bước 1:

o Cho VT= {VG} , ET = ∅

- Bước 2:

o Chọn phân vùng X ∈ VT với |X| ≥ 2 nếu X tồn tại.

o Nếu không, chuyển sang bước 6

- Bước 3
o Với mỗi đồ thị liên thông C = (VC, EC) trong T ∖ X .
● Cho SC = ∪vT∈VC vT .
● Cho S = {SC | C là một đồ thị liên thông trong T ∖X }.
o Rút gọn các thành phần tạo thành G '= ((VG' , EG' ), c')
● VG’ = X ∪ S.
● EG’ = EG|X × X ∪ {(u, SC) ∈ X×S | (u, v) ∈ EG với v ∈ SC } ∪
{(SC1 , SC2) ∈ S × S | (u, v) ∈ EG với u ∈ SC1 và v ∈ SC2}
o c': VG' × VG' → R + là hàm công suất
● Nếu (u, SC) ∈ EG | X × S , c'(u, SC) = Σ v∈SC : (u, v) ∈EG c(u, v),
● Nếu (SC1 , SC2) ∈ E G | S × S , c'(SC1 , SC2) = Σ (u, v) ∈EG : u∈SC1
∧v∈SC2 c(u, v),

● c‘ (u, v) = c (u, v)
- Bước 4
o Chọn 2 đỉnh s, t ∈ X, lát cắt s-t nhỏ nhất chia G’ thành 2 phần
(A', B')
o Đặt A = (∪SC ∈ A’ ∩ S SC ) ∪ (A' ∩ X ),
B = (∪SC ∈ B’ ∩ S SC ) ∪ (B' ∩ X).
- Bước 5
o Xét VT = (VT ∖ X ) ∪ { A ∩ X, B ∩ X }
o Chọn cạnh e = (X, Y) ∈ E T
● Nếu Y ⊂ A , đặt e’ = (A ∩ X, Y), hoặc e’ = (B ∩ X, Y)
▪ Đặt ET = (ET ∖ { e }) ∪ { e’ } và w( e’ ) = w( e ).
o Đặt ET = ET ∪ {( A ∩ X, B ∩ X )}.
o Đặt w ((A ∩ X, B ∩ X)) = c’(A’, B’)
o Quay lại bước 2
- Bước 6
o Thay thế: mỗi { v } ∈ VT bởi v,
mỗi ({ u }, { v }) ∈ ET bởi (u, v).
o Output T, chú ý rằng chỉ lặp |V| - 1 lần.

Trang 6
Đồ án Giải thuật & Lập trình

4. BÀI TOÁN ỨNG DỤNG


Các bài toán về lưu lượng như trạm bơm nước, luồng giao thông, mạng
lưới điện, v.v… và các bài toán sử dụng đồ thị hầu như có thể sử dụng cây
Gomory-Hu để giải.
4.1. Bài 1
- Đề bài:
Các nước trên thế giới mở rộng quan hệ ngoại giao với nhau một nước
có thể có mối quan hệ ngoại giao với nhiều nước .Để đánh giá mức độ quan hệ
giữa đất nước A với đất nước B người ta dựa vào nguồn ngoại tệ đầu tư thấp
nhất có thể giữa A, B. Hãy xác định nguồn ngoại tệ giữa hai nước A và B. Cho
rằng nguồn ngoại tệ chính là trọng số kết nối giữa hai đỉnh trong đồ thị vô
hướng có trọng số.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dòng tiếp theo k , số lượng cặp đỉnh cần thể hiện khả năng thông
qua
K dòng tiếp theo , mỗi dòng chứa 2 số nguyên u ,v
Dữ liệu ra:
Trọng số lát cắt của các đỉnh u , v ở k dòng
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tìm trong cây cạnh số của các cạnh cần tìm.
4.2. Bài 2
- Đề bài:
Hằng năm sự trao đổi buôn bán giữa các khu vực trên thế giới đã đem
lại một nguồn thuế vận chuyển nhất định. Nguồn thuế vận chuyển giữa hai
vùng được xem như trọng số giữa đỉnh A và B trên đồ thị vô hướng có trọng
số. Hãy tính cách vận chuyển giữa các vùng khác nhau sao cho nguồn thế này
là ít nhất.

Trang 7
Đồ án Giải thuật & Lập trình

Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dữ liệu ra:
Cây Gomory-Hu
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
4.3. Bài 3
- Đề bài:
Trong thời đại mở cửa quan hệ ngoại giao , các nước trên thế giới đều
mở rộng ngoại giao nhưng cũng có những nước vẫn đóng cửa thực hiện tự
cung tự cấp .Mức độ quan hệ giữa các nước được biết đến thông qua nguồn
đầu tư ít nhất của các nước với nhau. Giả sử hệ thống các nước như một đồ thị
vô hướng có trọng số , hãy cho biết mức độ quan hệ giữa các nước nếu có và
thống kê mức độ mở cửa của từng nước.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số lượng đỉnh
và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một cạnh
vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dữ liệu ra:
Cây Gomory-Hu , số đỉnh liên kết của từng đỉnh trong cây T
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tìm đếm số lượng đỉnh liên kết với từng đỉnh trong cây T.

4.4. Bài 4
- Đề bài:

Trang 8
Đồ án Giải thuật & Lập trình

Sự lưu thông trao đổi hàng hóa giữa các vùng trong nước ta nhưng một
đồ thị vô hướng ,giả sử số lượng hàng hóa trao đổi giữa hai vùng là trọng số
giữa hai đỉnh trong đồ thị vô hướng đó. Hãy liệt kê những vùng có số lượng
hàng hóa trao đổi không vượt quá số lượng hàng hóa dự kiến.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số lượng đỉnh
và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một cạnh
vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dòng tiếp theo số nguyên x
Dữ liệu ra:
Tất các các cạnh của cây Gomory-Hu có khả năng thông qua nhỏ
hơn x
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tìm trong cây cạnh có trọng số nhỏ hơn x trong tất cả các cạnh.
4.5. Bài 5
- Đề bài:
Sự trao đổi , buôn bán của các vùng trong đất nước ta như một đồ thị vô
hướng , có trọng số. Nhà nước muốn thay đổi ngân sách hỗ trợ cho một vùng
thì điều này sẽ ảnh hưởng đến sự liên kết của vùng đó với một số vùng khác.
Giả sử nguồn kinh phí trao đổi buôn bán giữa hai vùng với nhau xem như trọng
số giữa hai đỉnh trong đồ thị .hãy cho biết nguồn kinh phí nhỏ nhất giữa hay
vùng A,B và ảnh hưởng đến các vùng khác thay đổi như thế nào nếu nhà nước
thay đổi nguồn đầu tư vào vùng A,B.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dòng tiếp theo 3 số nguyên u,v cần thay đổi khả năng thông qua k

Trang 9
Đồ án Giải thuật & Lập trình

Dữ liệu ra:
Sự thay đổi trọng số của các cạnh
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Xuất các cạnh có trọng số thay đổi.
4.6. Bài 6
- Đề bài:
Hôm nay Shiro được học về đồ thị và lát cắt của đồ thị. Bài tập về nhà
của Shiro hôm nay là tìm cặp đỉnh có lát cắt sao cho độ lớn của lát cắt là nhỏ
nhất trong tất cả các lát cắt. Những gì Shiro hiểu về một lát cắt đó là một cách
chia các đỉnh của đồ thị thành 2 tập hợp sao cho s và t thuộc 2 tập khác nhau
sau khi chia và trong đồ thị có trọng số, độ lớn của một lát cắt được định nghĩa
là tổng trọng số của các cạnh bị lát cắt cắt qua. Với tư cách là một người bạn
của Shiro, bạn hãy giúp bạn ấy làm bài tập này 1 cách nhanh nhất.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số lượng đỉnh
và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một cạnh
vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dữ liệu ra:
Trọng số lát cắt là nhỏ nhất
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tìm trong cây cạnh có trọng số nhỏ nhất trong tất cả các cạnh.
4.7. Bài 7
- Đề bài:
Bài tập về nhà của Ash là 1 đồ thị nho nhỏ gồm n đỉnh và m cạnh. Yêu
cầu của bài tập là làm sao để có thể biến đổi đồ thị đó về thành cây sao cho
trọng số của lát cắt tối thiểu trong đồ thị đó bằng trọng số của các cạnh trong
cây, sau đó tìm k cạnh có trọng số nhỏ nhất và loại bỏ cạnh đó. Thế nhưng do
không tập trung, Ash đã không nhớ cách để biến đổi đồ thị về cây. Bạn hãy
giúp Ash giải quyết vấn đề này nhé.
Dữ liệu vào:

Trang 10
Đồ án Giải thuật & Lập trình

Dòng đầu tiên T là số lượng test


Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Số k thể hiện số cạnh của cây cần bị loại bỏ (k<n-1)
Dữ liệu ra:
Cây T sau khi loại trừ k cạnh có trọng số nhỏ nhất.
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tìm k cạnh có trọng số là nhỏ nhất, rồi loại bỏ chúng.
Xuất cây T sau khi đã loại bỏ k cạnh bé nhất.
4.8. Bài 8
- Đề bài:
Zayn là một kiến trúc sư tài ba. Một ngày, cậu được yêu cầu làm lại
đường ống nước cho dân cư nọ, gồm n nhà. Nhưng khi nhận được bản thiết kế
cũ từ trưởng khu dân cư, cậu đã bất ngờ khi m đường ống nước ở đây có trữ
lượng không ổn định. Vì là một người tiết kiệm nên Zayn đã làm lại đường ống
sao cho chỉ có 1 ống nối giữa hai nhà và trữ lượng nước qua ống đó là trữ
lượng tối đa dựa vào các ống cũ.
Khi trả tiền cho Zayn, trưởng khu dân cư đó đã trả dựa vào số trữ lượng nước
đi qua của k nhà cuối (với số nhà lớn nhất) với số tiền 10$/1 khối nước. Hãy
tính số tiền mà Zayn nhận được sau khi thiết kế xong đường ống.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
k là tổng số nhà có mã số lớn nhất trong cây T (k<=n)
Dữ liệu ra:
Số tiền mà Zayn nhận được
- Thuật toán:

Trang 11
Đồ án Giải thuật & Lập trình

Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Duyệt cây, tìm k đỉnh có số là lớn nhất.
Tìm trọng số của k đỉnh đó.
Số tiền Zayn nhận = trọng số k cạnh x 10.
Xuất số tiền nhận được.
4.9. Bài 9
- Đề bài:
Một mạng giao thông gồm n nút giao thông, và có m đường một chiều
nối một số cặp nút, thông tin về một đường gồm ba số nguyên dương u, v là
tên hai nút đầu mút của đường, và c là lưu lượng xe có thể lưu thông trên 1 giờ
ở đoạn đường đó.
Tìm lưu lượng tối đa xe chạy qua các nút liền kề nhau vào lúc 12h đến 14h. 2
nút nào có số xe chạy qua là lớn nhất?
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
Dữ liệu ra:
X Y 1 Y2
Trong đó: X là lưu lượng tối đa xe chạy qua các nút lúc 12h tới 14h
Y1, Y2 là các nút có lượng xe chạy qua là lớn nhất

- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây T.
Tính cây T2 sao cho T2 bằng 2 lần cây T.
Tìm trong T cạnh có trọng số lớn nhất.
Xuất cây T, 2 đỉnh của cạnh có trọng số lớn nhất.

4.10. Bài 10
- Đề bài:
Một xã gồm N nhà và có M đường dây điện 1 chiều nối 1 số nhà với
nhau. Thông tin về đường dây bao gồm 3 số u, v, c bao gồm u, v là số nhà được
nối với nhau bởi dây điện có số điện là c.

Trang 12
Đồ án Giải thuật & Lập trình

Chủ tịch xã yêu cầu làm lại đường dây sao cho trữ lượng điện đi qua là tối
đa dựa vào mạng điện ban đầu, và giữa 2 nhà chỉ có 1 đường dây nối liền.
Xuất ra số điện của xã, sau đó tính số dây giữa 2 hộ gia đình có trữ lượng
điện sử dụng bé hơn k.
Dữ liệu vào:
Dòng đầu tiên T là số lượng test
Với mỗi test, dòng đầu chứa 2 số nguyên n và m, thể hiện số
lượng đỉnh và số lượng cạnh của đồ thị.
m dòng tiếp theo, mỗi dòng chứa 3 số nguyên u, v, c thể hiện một
cạnh vô hướng với khả năng thông qua c giữa đỉnh u và v; 1 <= u,v <= n.
k thể hiện số điện cần so sánh.
Dữ liệu ra:
Đầu tiên: Số điện của xã.
Thứ 2: Số lượng dây giữa 2 nhà mà có trữ lượng điện đi qua lớn
hơn x.
- Thuật toán:
Áp dụng thuật toán cây Gomory-Hu để chuyển đổi đồ thị thành cây.
Tính tổng trọng số của các cạnh trong cây T.
So sánh trọng số của các cạnh với x, nếu lớn hơn x thì đếm tăng lên.
Xuất tổng, đếm.

5. KẾT LUẬN

5.1. Ưu điểm
Thời gian chạy của thuật toán Gomory-Hu Tree là O˜ (min(n 2/3 ,m 1/2
)m)
Chỉ chạy |V-1| dòng chảy tối đa

Trang 13
Đồ án Giải thuật & Lập trình

5.2. Nhược điểm


Chỉ áp dụng cho đồ thị vô hướng
Chỉ có hiệu quả với đồ thị đơn giản khoảng 2000 đỉnh

TÀI LIỆU THAM KHẢO


Wikipedia: https://en.wikipedia.org/wiki/Gomory%E2%80%93Hu_tree

Giải thuật lập trình: http://www.giaithuatlaptrinh.com/?p=1483


GeeksforGeeks: https://www.geeksforgeeks.org/gomory-hu-tree-
introduction/

Trang 14

You might also like