Nếu E gồm cả cạnh và cung thì G là đồ thị hỗn hợp Đa đồ thị: Đồ thị G=X,E vô hướng hoặc có hướng là đồ thị khi và chỉ khi nó là đồ thị không khuyên và có ít nhất một cặp đỉnh được nối
Trang 1Đề tài:
DUYỆT ĐỒ THỊ CÓ HƯỚNG &TÌM THÀNH PHẦN
LIÊN THÔNG MẠNH
GVHD: PGS.TS TRẦN QUỐC CHIẾN NHÓM HỌC VIÊN: NGUYỄN VĂN ĐỊNH NGUYỄN TUẤN TRUNG
HỒ TRÚC LÂM
LÊ QUỐC DŨNG ĐOÀN XUÂN LỘC MÔN: TOÁN ỨNG DỤNG LỚP: CAO HỌC K24 CHUYÊN NGÀNH: KHOA HỌC MÁY TÍNH
Đà Nẵng, 03/05/2012
Trang 2MỤC LỤC
***
MỤC LỤC 1
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI 3
CHƯƠNG 2: ĐẠI CƯƠNG VỀ ĐỒ THỊ 4
I Một số khái niệm về đồ thị 4
II Các khái niệm về đường đi, chu trình 5
III Tính liên thông của đồ thị 6
CHƯƠNG 3: DUYỆT ĐỒ THỊ CÓ HƯỚNG & TÌM THÀNH PHẦN LIÊN THÔNG MẠNH 9
I Khái niệm đồ thị vô hướng và đồ thị có hướng 9
1 Đồ thị vô hướng 9
2 Đồ thị có hướng 9
II Khái niệm thành phần liên thông mạnh 9
1 Thành phần liên thông của đồ thị vô hướng 9
2 Thành phần liên thông mạnh của đồ thị có hướng 9
III Định lý biểu diễn thành phần liên thông mạnh 10
IV Thuật toán duyệt đồ thị và tìm thành phần liên thông mạnh 10
1 Thuật toán duyệt đồ thị có hướng 10
2 Sơ lược thuật toán Kosaraju tìm thành phần liên thông mạnh 10
3 Thuật toán Tarjan tìm thành phần liên thông 11
V Biểu diễn đồ thị 11
1 Biểu diễn đồ thị bởi ma trận kề 11
2 Biểu diễn đồ thị bởi ma trận liên thuộc 12
3 Biểu diễn đồ thị bởi danh sách cạnh (cung) 13
4 Biểu diễn đồ thị bởi danh sách kề 13
CHƯƠNG 4: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT BÀI TOÁN TÌM THÀNH PHẦN LIÊN THÔNG MẠNH 16
I ĐỊNH NGHĨA 16
Trang 32 Đối với đồ thị có hướng G = (V, E) 17
II TÍNH LIÊN THÔNG TRONG ĐỒ THỊ VÔ HƯỚNG 17
III ĐỒ THỊ ĐẦY ĐỦ VÀ THUẬT TOÁN WARSHALL 18
1 Định nghĩa 18
2 Bao đóng đồ thị 19
3 Thuật toán Warshall 19
IV CÁC THÀNH PHẦN LIÊN THÔNG MẠNH 21
1 Phân tích 21
2 Cây tìm kiếm DFS và các thành phần liên thông mạnh 23
3 Thuật toán Tarjan (R.E.Tarjan - 1972) 25
CHƯƠNG 5: MÃ NGUỒN CHƯƠNG TRÌNH VÀ KẾT QUẢ 32
I Mã nguồn chương trình 32
II Kết quả chương trình với các bộ thử 32
TÀI LIỆU THAM KHẢO 35
Trang 4CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
ĐỀ TÀI 3: DUYỆT ĐỒ THỊ CÓ HƯỚNG &TÌM THÀNH PHẦN LIÊN
THÔNG MẠNH
1 Trình bày khái niệm thành phần liên thông mạnh, định lý biểu diễnthành phần liên thông mạnh
2 Trình bày thuật toán duyệt đồ thị và tìm thành phần liên thông mạnh
3 Thiết kế cấu trúc dữ liệu và giải thuật
4 Viết chương trình cài đặt thuật toán bằng ngôn ngữ C
- Cài đặt chương trình
- Nghiên cứu giải thuật
- Cài đặt chương trình
- Nghiên cứu giải thuật
- Cài đặt chương trình
- Nghiên cứu giải thuậtcài đặt chương trình
5 Nguyễn Tuấn Trung - Viết chương 3
- Nghiên cứu giải thuật
- Kiểm thử chương trình
và tài liệu
Trang 5CHƯƠNG 2: ĐẠI CƯƠNG VỀ ĐỒ THỊ
Hai đỉnh x1 và x2 (x1≠ x2)của đồ thị được gọi là hai đỉnh kề nhau nếu chúng
là 2 đầu của một cạnh và một cung
Hai cạnh a,b (hoặc 2 cung a,b) gọi là hai cạnh kề nhau (hoặc 2 cung kề nhau)nếu chúng có một đỉnh chung
Khuyên là cạnh (hoặc cung) có 2 đầu trùng nhau
Đỉnh treo là đỉnh thuộc duy nhất một cạnh hoặc một cung
Đỉnh cô lập là đỉnh không thuộc cạnh hoặc cung nào
Số đỉnh của đồ thị gọi là bậc của đồ thị, số cạnh hoặc số cung của đồ thị gọi là
cỡ của đồ thị.
e
e
Trang 6 Nếu E gồm cả cạnh và cung thì G là đồ thị hỗn hợp
Đa đồ thị: Đồ thị G=(X,E) vô hướng (hoặc có hướng) là đồ thị khi và chỉ khi
nó là đồ thị không khuyên và có ít nhất một cặp đỉnh được nối với nhau bằng ítnhất 2 cạnh (hoặc 2 cung nối theo thứ tự của cặp đỉnh)
Đơn đồ thị: Đồ thị G=(X,E) vô hướng (hoặc có hướng) là đơn đồ thị khi vàchỉ khi nó là độ thị không khuyên và mỗi cặp đỉnh đươc nối với nhau không quámột cạnh (hoặc cung)
Đồ thị con: Cho đồ thị G=(V, E) Đồ thị G’=(V’, E’) gọi là đồ thị con của Gnếu
E E V
V' & '
II Các khái niệm về đường đi, chu trình
Định nghĩa Cho đồ thị G=(V,E)
Dãy từ đỉnh v đến đỉnh w là dãy các đỉnh và cạnh nối tiếp nhau bắt đầu
từ đỉnh v và kết thúc tại đỉnh w Số cạnh trên dãy gọi là độ dài của dãy .
Dãy từ đỉnh v đến đỉnh w độ dài n được biểu diễn như sau
- Đường đi sơ cấp là đường đi không đi qua một đỉnh quá 1 lần.
- Vòng là dãy có đỉnh đầu và đỉnh cuối trùng nhau.
- Chu trình là đường đi có đỉnh đầu và đỉnh cuối trùng nhau.
- Chu trình sơ cấp là chu trình không đi qua một đỉnh quá 1 lần.
- Dãy có hướng trong đồ thị có hướng là dãy các đỉnh và cung nối tiếp nhau (e1,
e2, , en) thoả mãn đỉnh cuối của cung ei là đỉnh đầu của cung ei+1 , i=1, n-1
- Đường đi có hướng trong đồ thị có hướng là dãy có hướng, trong đó các cung
Trang 7- Đường đi có hướng sơ cấp là đường đi có hướng không đi qua một đỉnh quá 1
lần
- Vòng có hướng là dãy có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
- Chu trình có hướng là đường đi có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
- Chu trình có hướng sơ cấp là chu trình có hướng không đi qua một đỉnh quá 1
lần
III Tính liên thông của đồ thị
Đối với đồ thị vô hướng G = (V, E)
G gọi là liên thông nếu luôn tồn tại đường đi giữa mọi cặp đỉnh phân biệt
của đồ thị
Nếu G không liên thông thì chắc chắn nó sẽ là hợp của hai hay nhiều đồthị con liên thông, các đồ thị con này đôi một 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ụ:
Đồ thị G và các thành phần liên thông G1, G2, G3 của nó
Đối với đồ thị có hướng G = (V, E)
Các khái niệm về tính liên thông của đồ thị có hướng tuỳ theo chúng ta cóquan tâm tới hướng của các cung không
G gọi là liên thông mạnh nếu luôn tồn tại đường đi (theo các cung định
hướng) giữa hai đỉnh bất kỳ của đồ thị
G gọi là liên thông yếu nếu đồ thị lót (vô hướng) của nó là liên thông.
G gọi là bán liên thông, nếu với mọi cặp đỉnh (u,v) bao giờ cũng tồn tại
đường đi có hướng từ u đến v hoặc từ v đến u
G1
G2
G3
Trang 8Liên thông mạnh và Liên thông yếu
Đồ thị con G’=(V’, E’) của đồ thị (có hướng) G=(V, E) gọi là thành phần liênthông (mạnh) của đồ thị G, nếu nó là đồ thị con liên thông (mạnh) tối đại của G,tức là không tồn tại đồ thị con liên thông (mạnh) G”=(V”, E”) G’ của G thoả
"
V , E ' E"
Một đồ thị là liên thông nếu và chỉ nếu nó có một thành phần liên thông mạnh
Định lý : Cho đồ thị đơn G=(V,E) với n đỉnh, và k thành phần liên thông Khi
đó số cạnh m của đồ thị thoả bất đẳng thức
n - k m (n k)(2n k 1)
Hệ quả: Mọi đơn đồ thị có n đỉnh và số cạnh lớn hơn (n 1)(2n 2) thì G liên
thông
Định lý biểu diễn thành phần liên thông mạnh
Mọi đồ thị có hướng G không liên thông mạnh được tạo thành từ tập hợpcác thành phần liên thông mạnh và tập hợp các cung nối các đỉnh của các thànhphần liên thông mạnh khác nhau
Chứng minh:
+ Xét đỉnh bất kỳ x G Ký hiệu S là tập hợp các đồ thị con lien thôngmạnh chứa x Hiễn nhiên {x}S và S có phần tử cực đại theo quan hệbao hàm Phần tử cực đại này chính là thành phần liên thông mạnh chứax
Trang 9+ Hai thành phần liên thông mạnh không có điểm chung vì nếu có điểmchung, chúng sẽ hợp nhất thành một thành phần liên thông mạnh.
+ Những cung không thuộc thành phần liên thông mạnh nào cả, hiển nhiên
sẽ liên thuộc các đỉnh trong các thành phần liên thông mạnh khác nhau
Trang 10CHƯƠNG 3: DUYỆT ĐỒ THỊ CÓ HƯỚNG & TÌM THÀNH PHẦN LIÊN
THÔNG MẠNH
I. Khái niệm đồ thị vô hướng và đồ thị có hướng
1. Đồ thị vô hướng:
Đồ thị vô hướng G = (V,E) gồm một tập V các đỉnh và tập E các cạnh.
Mỗi cạnh e E được liên kết với một cặp đỉnh (v, w) không kể thứ tự
2. Đồ thị có hướng
Đồ thị có hướng G = (V, E) gồm một tập V các đỉnh và tập E các cạnh có
hướng gọi là cung Mỗi cung e E được liên kết với một cặp đỉnh (v, w) có
thứ tự
II. Khái niệm thành phần liên thông mạnh
1. Thành phần liên thông của đồ thị vô hướng
Cho đồ thị G=(V, E) Đồ thị G’=(V’, E’) gọi là đồ thị con của G nếu
E E V
V' & '
Đồ thị con G’=(V’, E’) của đồ thị G=(V, E) gọi là thành phần liên thôngcủa đồ thị G, nếu nó là đồ thị con liên thông tối đại của G, tức là không tồntại đồ thị con liên thông G”=(V”, E”) G’ của G thoả V ' V",
"
2. Thành phần liên thông mạnh của đồ thị có hướng
Thành phần liên thông mạnh của đồ thị có hướng G là đồ thị con liên
thông mạnh tối đại của G
Đồ thị có hướng G được gọi là liên thông mạnh nếu với hai đỉnh phânbiệt bất kỳ u và v của G đều có đường đi từ u tới v và đường đi từ v tới u.Cho đồ thị có hướng G=(V, E) Đồ thị G’=(V’, E’) gọi là đồ thị con của
G nếu
E E V
V' & '
Đồ thị con G’=(V’, E’) của đồ thị có hướng G=(V, E) gọi là thành phầnliên thông mạnh của đồ thị G, nếu nó là đồ thị con liên thông tối đại của G,
Trang 11tức là không tồn tại đồ thị con liên thông mạnh G”=(V”, E”) G’ của Gthoả V ' V", E ' E".
III. Định lý biểu diễn thành phần liên thông mạnh
Mọi đồ thị có hướng G không liên thông mạnh được tạo thành từ tập hợp cácthành phần liên thông mạnh và tập hợp các cung nối các đỉnh của các thành phầnliên thông mạnh khác nhau
IV. Thuật toán duyệt đồ thị và tìm thành phần liên thông mạnh
1. Thuật toán duyệt đồ thị có hướng
Đầu vào: Đồ thị G=(V,E), V={1,2,….n}
Đầu ra: Thứ tự trước preord(i) và thứ tự sau postord(i) của đỉnh i,
i=1,2,…,n
Các bước:
B1 for (i=1; t[i]=0; i=n);
B2 Với mỗi i chạy từ 1 đến n thì
2. Sơ lược thuật toán Kosaraju tìm thành phần liên thông mạnh
Đồ thị có hướng liên thông mạnh nếu mọi cặp đỉnh của nó đều cóđường đi có hướng nối chúng với nhau
Đồ thị con G’ = (V’, E’) của đồ thị có hướng G = (V, E) gọi là thànhphần liên thông mạnh của đồ thị G, nếu nó là đồ thị con liên thông mạnhtối đại của G
Đầu vào: Đồ thị có hướng G=(V, E), V={1, 2, …n}
Đầu ra: Số thành phần liên thông K
Trang 12Cây con Ti phủ thành phần liên thông thứ i, i=1, …, K
for i:=1 to n do tplt[i]:=0; K:=0;
for postord(u):=n downto 1 do
if tplt[u] = 0 then
beginK:=K+1;
<xuất phát từ đỉnh u thực hiện thuật toán tìm cây phủ TK, trong đó mỗi đỉnh
v thuộc cây TK được gán tplt[v]:=K>end;
3. Thuật toán Tarjan tìm thành phần liên thông
Thuật toán này sẽ được trình bày chi tiết trong phần Thiết kế giải thuật
V. Biểu diễn đồ thị
Để giải quyết các vấn đề của đồ thị bằng máy tính chúng ta cần lưu giữ đồthị trong bộ nhớ của máy tính Do đó chúng ta cần đưa ra các phương pháp biểudiễn đồ thị bởi các cấu trúc dữ liệu Có nhiều phương pháp biểu diễn đồ thị: biểudiễn đồ thị bằng ma trận kề, ma trận liên thuộc, danh sách cạnh(cung) và danhsách kề
1. Biểu diễn đồ thị bởi ma trận kề
Trong các thuật toán đồ thị sẽ trình bày sau này, chúng ta không quan tâmtới các thông tin về các đỉnh, vì vậy chỉ cần cho mỗi đỉnh một tên gọi đểphân biệt nó với các đỉnh khác Do đó, với một đồ thị N đỉnh ta luôn luônxem tập các đỉnh của nó V = {0, 1, 2, …, N-1}
Trang 13Trong cách biểu diễn đồ thị bởi ma trận kề, đồ thị N đỉnh được lưu trongmảng A hai chiều cỡ N, trong đó
A[u][v] = 1 nếu có cung (u,v)
A[u][v] = 0 nếu không có cung (u,v)
Nếu đồ thị là đồ thị có trọng số thì thay cho mảng bool ta sử dụng mảngcác số, trong đó A[u][v] sẽ lưu trọng số của cung uv
Như vậy, ta có thể biểu diễn đồ thị N đỉnh bởi mảng Graph được xácđịnh như sau:
2. Biểu diễn đồ thị bởi ma trận liên thuộc
Cho đồ thị có hướng không khuyên G=(V,E) có n đỉnh, V={v1, v2,….,vn}
và m cung E={e1, e2, …, em} Ma trận liên thuộc của đồ thị G là ma trận
e3
e8
Trang 143. Biểu diễn đồ thị bởi danh sách cạnh (cung)
Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung), nó sẽ lưu trữ tất
cả các cạnh (cung) của đồ thị có hướng Một cung e=(x,y) của đồ thị sẽtương ứng với hai biến Dau(e) và Cuoi(e)
4. Biểu diễn đồ thị bởi danh sách kề:
Trong rất nhiều vấn đề ứ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 nhất
Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị chúng ta lưu trữ danh sách các đỉnh kề với nó, mà ta sẽ kí hiệu là
6
Trang 15Ke(v) = { u V/ (v,u) E}
Khi đó vòng lặp thực hiện với mỗi một phần tử trong danh sách này theo thứ tự các phần tử được sắp xếp trong nó sẽ được viết như sau:
u Ke(v) do <công việc>
Sau đây là các ví dụ về danh sách kề liên kết:
Trang 16Ke[6] = nil
CHƯƠNG 4: THIẾT KẾ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT BÀI
TOÁN TÌM THÀNH PHẦN LIÊN THÔNG MẠNH
1. Đối với đồ thị vô hướng G = (V, E)
G gọi là liên thông (connected) nếu luôn tồn tại đường đi giữa mọi cặp đỉnh
Trang 17Nếu G không liên thông thì chắc chắn nó sẽ là hợp của hai hay nhiều đồ thị con*liên thông, các đồ thị con này đôi một không có đỉnh chung Các đồ thị con liênthông rời nhau như vậy được gọi là các thành phần liên thông của đồ thị đangxét Xem hình sau:
Đồ thị G và các thành phần liên thông G1, G2, G3 của nó
Đôi khi, việc xoá đ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 mới có nhiều thành phần liên thông hơn đồ thị ban đầu, các đỉnh như thế
gọi là đỉnh cắt hay điểm hớp.
Hoàn toàn tương tự, những cạnh mà khi ta bỏ nó đi sẽ tạo ra một đồ thị có nhiều
thành phần liên thông hơn so với đồ thị ban đầu được gọi là một cạnh cắt hay một cầu.
Khớp và cầu
2. Đối với đồ thị có hướng G = (V, E)
Có hai khái niệm về tính liên thông của đồ thị có hướng tuỳ theo chúng ta cóquan tâm tới hướng của các cung không
G gọi là liên thông mạnh (Strongly connected) nếu luôn tồn tại đường đi (theo các cung định hướng) giữa hai đỉnh bất kỳ của đồ thị, g gọi là liên thông yếu
(weakly connected) nếu đồ thị vô hướng nền của nó là liên thông
Trang 18Liên thông mạnh và Liên thông yếu
* Đồ thị G = (V, E) là con của đồ thị G' = (V', E') nếu G là đồ thị có VV' vàEE'
Một bài toán quan trọng trong lý thuyết đồ thị là bài toán kiểm tra tính liên thôngcủa đồ thị vô hướng hay tổng quát hơn: Bài toán liệt kê các thành phần liên thôngcủa đồ thị vô hướng
Giả sử đồ thị vô hướng G = (V, E) có n đỉnh đánh số 1, 2, , n
Để liệt kê các thành phần liên thông của G phương pháp cơ bản nhất là:
Đánh dấu đỉnh 1 và những đỉnh có thể đến từ 1, thông báo những đỉnh đóthuộc thành phần liên thông thứ nhất
Nếu tất cả các đỉnh đều đã bị đánh dấu thì G là đồ thị liên thông, nếukhông thì sẽ tồn tại một đỉnh v nào đó chưa bị đánh dấu, ta sẽ đánh dấu v
và các đỉnh có thể đến được từ v, thông báo những đỉnh đó thuộc thànhphần liên thông thứ hai
Và cứ tiếp tục như vậy cho tới khi tất cả các đỉnh đều đã bị đánh dấu
Trang 19begin Count := Count + 1;
WriteLn('Thành phần liên thông thứ ', Count, ' gồm các đỉnh : ');
Giữa đỉnh u và v của G' có cạnh nối Giữa đỉnh u và v của G có đường đi
Đồ thị G' xây dựng như vậy được gọi là bao đóng của đồ thị G
Trang 20Từ định nghĩa của đồ thị đầy đủ, ta dễ dàng suy ra một đồ thị đầy đủ bao giờcũng liên thông và từ định nghĩa đồ thị liên thông, ta cũng dễ dàng suy ra được:
Một đơn đồ thị vô hướng là liên thông nếu và chỉ nếu bao đóng của nó là
đồ thị đầy đủ
Một đơn đồ thị vô hướng có k thành phần liên thông nếu và chỉ nếu baođóng của nó có k thành phần liên thông đầy đủ
Đơn đồ thị vô hướng và bao đóng của nó
Bởi việc kiểm tra một đồ thị có phải đồ thị đầy đủ hay không có thể thực hiệnkhá dễ dàng (đếm số cạnh chẳng hạn) nên người ta nảy ra ý tưởng có thể kiểm tratính liên thông của đồ thị thông qua việc kiểm tra tính đầy đủ của bao đóng Vấn
đề đặt ra là phải có thuật toán xây dựng bao đóng của một đồ thị cho trước vàmột trong những thuật toán đó là:
3. Thuật toán Warshall
Thuật toán Warshall - gọi theo tên của Stephen Warshall, người đã mô tả thuậttoán này vào năm 1960, đôi khi còn được gọi là thuật toán Roy-Warshall vì Roycũng đã mô tả thuật toán này vào năm 1959 Thuật toán đó có thể mô tả rất gọn:
Từ ma trận kề A của đơn đồ thị vô hướng G (aij = True nếu (i, j) là cạnh của G)
ta sẽ sửa đổi A để nó trở thành ma trận kề của bao đóng bằng cách: Với mọi đỉnh
k xét theo thứ tự từ 1 tới n, ta xét tất cả các cặp đỉnh (u, v): nếu có cạnh nối (u, k) (auk = True) và có cạnh nối (k, v) (akv = True) thì ta tự nối thêm cạnh (u, v) nếu nó chưa có (đặt auv := True) Tư tưởng này dựa trên một quan sát
đơn giản như sau: Nếu từ u có đường đi tới k và từ k lại có đường đi tới v thì tất