Bài toán tìm chu trình trên ** th* vô h**ng

Download Report

Transcript Bài toán tìm chu trình trên ** th* vô h**ng

Bài toán tìm chu trình trên đồ thị
vô hướng bằng DFS
I. Một số khái niệm cơ bản
 Cho 1 đồ thị vô hướng G = (V, E) với |V| = n, |E| = m
 Thuật toán DFS ( depth-first search) dựng 1 cây có
hướng từ gốc (nút đầu tiên trong tập đỉnh V).
 Nếu tồn tại đường đi có hướng từ v đến w, thì v được
gọi là tổ tiên của w, còn w được gọi là hậu duệ của v.
 Cấu trúc nút kề nút (node-node adjacency) là một ma
trận nxn. Phần tử aij = 1 nếu nút i kề với nút j và bằng 0
nếu ngược lại.
 Cấu trúc nút kề cạnh (node-edge adjacency) là danh sách
tất cả các nút, với mỗi nút lại liệt kê tất cả các nút kề với
nó.
I. Một số khái niệm cơ bản
 Cấu trúc nút kề nút:
1 2 3 4
1 0 1 1 0
2 1 0 1 0
3 1 1 0 1
4 0 0 1 0
 Cấu trúc nút kề cạnh:
1: 2, 3
2: 1, 3
2
1
3
4
3: 1, 2, 4
4: 3
II. Tìm chu trình trong đồ thị bằng
DFS
 Có thể tìm chu trình trong đồ thị vô hướng bằng thuật
toán DFS và thường sử dụng cấu trúc dữ liệu nút kề
cạnh
 Trong đó, các nút được đánh số từ 1 đến n.
 Bản ghi nút i liệt kê các nút kề với nút i
 Thuật toán DFS bắt đầu bằng việc xác lập nút 1 là nút
hiện thời.
II. Tìm chu trình trong đồ thị bằng
DFS




Lặp lại thuật toán DFS ( với i là nút hiện thời)
Nếu có ít nhất 1 nút trong bản ghi của nút i vẫn chưa
được đến thăm từ i và giả sử j là nút đầu tiên chưa được
đến thăm.
Nếu j đã được đến thăm bởi các nút khác rồi, thì ta đánh
dấu cạnh (i, j) là cạnh quay lại, còn không thì đánh dấu
(i, j) là cạnh của cây và i là cha của j.
Đánh dấu j là nút đã được đến thăm trong bản ghi của
nút i và xác lập i là nút hiện thời.
Nếu tất cả các nút của bản ghi của nút i đã được đến
thăm, thì ta xác lập nút k (cha của nút i) là nút hiện thời.
II. Tìm chu trình trong đồ thị bằng
DFS
 Thuật toán sẽ dừng lại khi nút 1 là nút hiện thời (tức là
thuật toán quay trở lại nút 1).
 Khi đó, mỗi một cạnh quay lại (i, j) xác định 1 chu trình.
 Một chu trình bao gồm cạnh quay lại (i, j) và các cạnh
trên cây định đường đi từ j đến i.
 Như vậy, có thể xác định 1 chu trình bởi các cạnh quay
lại như là chu trình cơ sở của đồ thị. Khi đó, mỗi chu
trình của đồ thị là tập hợp hai hay nhiều chu trình từ các
chu trình cơ sở.
II. Tìm chu trình trong đồ thị bằng
DFS
2
 Cấu trúc nút kề cạnh:
1: 2, 3
3: 1, 2, 4
2: 1, 3
4: 3
 DFS thực hiện như sau:
nút hiện thời
cạnh
nút hiện thời
1
(1, 2) tree
3
2
(2, 3) tree
3
3
(3, 4) tree
2
4
none
1
1
3
4
cạnh
(3, 1) back
none
none
END
II. Tìm chu trình trong đồ thị bằng
DFS
 Một cơ sở chu trình là một tập m – (n-1) các chu trình
độc lập với nhau theo nghĩa chúng ta không thể dựng lại
một chu trình trong tập này bằng cách tổ hợp hai hay
nhiều chu trình khác ở trong tập.
 Tập m – (n – 1) cạnh quay lại xác định một cơ sở chu
trình. Đây không phải là cơ sở chu trình duy nhất.
 Phương pháp để xác định không có chu trình nào tồn tại
là không có bất cứ cạnh chồng nào giữa hai chu trình
trong tập cơ sở.
II. Tìm chu trình trong đồ thị bằng
DFS
 Bất kì một chu trình nào khác của đồ thị có thể tìm được
bằng cách tổ hợp hai hay nhiều chu trình trong tập chu
trình cơ sở.
 Tổ hợp bằng cách sử dụng toán tử OR
II. Tìm chu trình trong đồ thị bằng
1
DFS
 Cấu trúc nút – kề:
 1: 2
 2: 1, 3, 6
 3: 2, 4, 6
4: 3, 5, 6
5: 4, 6
6: 2, 3, 4, 5
 DFS thực hiện như sau:
1: (1,2) tree
2: (2,3) tree
3: (3,4) tree
4: (4,5) tree
6
2
5
3
4
5: (5,6) tree
6: (6,2) back
6: (6,3) back
6: (6,4) back
II. Tìm chu trình trong đồ thị bằng
DFS
 Một chu trình bao gồm cạnh quay lại (i,j) và các cạnh
cây duy nhất định đường đi từ j đến i.
 Khi đó, các chu trình có thể xác định được là:
 2–3–4–5–6–2
 3–4–5–6–3
 4–5–6–4
 Rõ ràng là còn một số chu trình bị bỏ sót như:
 2–3–6–2
 2 – 3 – 4 – 6 -2
 3–4–6-3
1
6
2
5
3
4
II. Tìm chu trình trong đồ thị bằng
DFS
1
 Giả sử các cạnh của đồ thị là các vecto:
 Với cấu trúc nút – kề:
 1: 2
 2: 1, 3, 6
 3: 2, 4, 6
4: 3, 5, 6
5: 4, 6
6: 2, 3, 4, 5
6
2
5
3
4
Các vecto của đồ thị:
(1, 2), (2, 3), (2, 6), (3, 4), (3, 6), (4, 5), (4, 6), (5, 6)
Khi đó, chu trình (2,3,4,5,6,2) được biểu diễn : 01110101
chu trình (3,4,5,6,3): 00011101
II. Tìm chu trình trong đồ thị bằng
DFS
1
 Thực hiện toán tử OR với hai chuỗi nhị phân trên:
6
01110101
OR
00011101
5
01101000
Chu trình mới là: (2,3), (2,6), (3, 6)
4
hay là chu trình (2, 3, 6, 2)
2
3