Professional Documents
Culture Documents
đồ án Giải thuật và lập trình
đồ án Giải thuật và lập trình
ĐỒ ÁN
Đà 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
2. ĐỊNH NGHĨA
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.
Trang 5
Đồ án Giải thuật & Lập trình
- Bước 1:
- Bước 2:
- 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
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
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
Trang 14