1. Trang chủ
  2. » Luận Văn - Báo Cáo

Lý thuyết đồ thị giải bài tập xác định thành phần liên thông thành phần liên thông mạnh thuật toán tarjan

17 17 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lý thuyết đồ thị giải bài tập xác định thành phần liên thông thành phần liên thông mạnh thuật toán tarjan
Người hướng dẫn Đặng Trần Minh Hậu, Nguyễn Ngọc Thảo
Trường học Trường Đại Học Khoa Học Tự Nhiên
Chuyên ngành Lý Thuyết Đồ Thị
Thể loại Báo Cáo Đồ Án
Thành phố Hà Nội
Định dạng
Số trang 17
Dung lượng 2,88 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lý thuyết đồ thị giải bài tập xác định thành phần liên thông mạnh giải bài tập xác định thành phần liên thông yếu xác định đồ thị liên thông Giải bài tập thuật toán Tarjan Cài đặt thuật toán Tarjan Biểu diễn thuật toán Tarjan Xác định số thành phần liên thông strongly connected component

Trang 1

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN – HỆ VB2 ĐÀO TẠO TỪ XA



GVHD Lý Thuyết: Đặng Trần Minh Hậu

GDHD Thực hành: Nguyễn Ngọc Thảo

LỚP: Lý Thuyết Đồ Thị - CSC00008 NHÓM 32



BÁO CÁO

ĐỒ ÁN 1

Trang 2

MỤC LỤC

A Nội dung lý thuyết 3

Câu 1 3 Câu 2 3

B Nội dung cài đặt

13

Trang 3

A NỘI DUNG LÝ THUYẾT

Câu 1: Định nghĩa thành phần liên thông mạnh (strongly connected component) trên đồ thị có hướng

Một thành phần liên thông mạnh của một đồ thị có hướng A là

+ Một tiểu đồ thị (tiểu đồ thị này có tính chất tối đại, tức là không một cạnh khác nào của đồ thị có hướng cha (A) của nó tồn tại trong tiểu đồ thị này mà không làm mất đi tính chất liên thông mạnh của nó)

+ Tính chất của một tiểu đồ thị trong đồ thị có hướng là tính chất liên thông mạnh (tất cả các cặp đỉnh trong tiểu đồ thị đó có đường đi thuận tới nhau được và đường đi ngược lại)

Câu 2:

Ta có thể tìm thành phần liên thông mạnh bằng nhiều phương pháp khác nhau (tham khảo Tài liệu 1) Chọn trình bày một giải thuật để tìm thành phần liên thông mạnh Phần trình bày cần nêu rõ các vấn đề sàu: ý tưởng tổng quát của giải thuật, các bước thực hiện của giải thuật được thể hiện bằng ví dụ cụ thể, và đánh giá ngắn về ưu điểm – khuyết điểm của giải thuật.

Giải thuật Tarjan cho các thành phần liên thông mạnh (Tarjan's strongly connected components algorithm)

a Ý tưởng tổng quát của giải thuật

 Giải thuật Tarjan trên nền thuật toán tìm đường theo chiều sâu DFS kết hợp với các tính chất trong một thành phần liên thông mạnh và các tính chất giữa các thành phần liên thông mạnh trong một đồ thị có hướng với nhau, mục đích để xác định từng thành phần liên thông mạnh trong một đồ thị có hướng

 Tính chất có thể được sử dụng

+ Trong một thành phần liên thông mạnh đỉnh nhỏ nhất có thể kết nối từ một đỉnh thành viên của

thành phần liên thông mạnh đều giống nhau và là đỉnh nhỏ nhất trong thành phần liên thông mạnh đó + Đỉnh kết nối nhỏ nhất này cố định và là duy nhất cho 1 thành phần liên thông mạnh (tức nếu qua thành phần liên thông mới sẽ có đỉnh kết nối nhỏ nhất mới)

+ Việc các liên kết “quay trở lại’’ không thể xuất hiện giữa thành phần liên thông mạnh này và thành phần liên thông mạnh khác ,chỉ xuất hiện trong 1 thành phần liên thông mạnh

=> Ghi lại đỉnh kết nối nhỏ nhất của một đỉnh và so sánh kết quả này với đỉnh cha của nó (node tỏa

nhánh) để tìm ra đỉnh kết nối nhỏ nhất từ các node con với nhau và với của node cha, tương tự theo dòng

đệ quy để lên node cha cao hơn

 Sau khi hoàn thành các thủ tục ghi lại thứ tự đỉnh của đỉnh đang duyệt và ghi lại đỉnh kết nối nhỏ nhất của nó ta có thể đưa đỉnh đó vào Stack

 Nếu đỉnh kết nối nhỏ nhất bằng chính số thứ tự đi qua của đỉnh thì ta có thể kết luận đỉnh đó là 1 node bắt đầu cho một thành phần liên thông mạnh, và tất cả các đỉnh của thành phần liên thông mạnh đó đều có chung đỉnh kết nối nhỏ nhất

 Trên đường đi (của đệ quy) ta có thể in ra hoặc ghi lại (chứa) số thứ tự và các phần tử của từng thành phần liên thông mạnh bằng cách lấy ra từ Stack

Các mảng và biến cần khởi tạo và chức năng gồm (ví dụ)

pointIndex - [] mảng một chiều int

- Chiều dài: bằng số đỉnh trong đồ thị

Chứa thứ tự duyệt qua của từng phần tử

Trang 4

pointLowIndex -[] mảng một chiều int

- Chiều dài: bằng số đỉnh trong đồ thị

Chứa số thứ tự đỉnh nhỏ nhất mà đỉnh đang xét liên kết

Stack -[] mảng một chiều int

- Chiều dài: xuất phát là 0 , độ dài +1 nếu thêm 1 phần tử, -1 nếu giảm 1 phần tử

Chứa các phần tử đã gán pointIndex và pointLowIndex

isOnStack -[] mảng một chiều bool

- Chiều dài: bằng số đỉnh trong đồ thị

Chứa các đánh dấu true hoặc false xác định một phần tử đã cho vào Stack hay chưa

chạy Tarjan)

(Tùy chọn)

MangTPLT

thành phần liên thông chứa các đỉnh của tplt đó

 Cũng như DFS, thuật toán Tarjan gồm 1 hàm main để khởi tạo thuật toán (duyệt các đỉnh v trong

tập đỉnh V của đồ thị) và một hàm Tarjan nhằm đánh số các phần tử đỉnh, đánh số các phần tử đỉnh

kết nối của các phần tử đỉnh trong đồ thị, cho vào stack

b Các bước thực hiện của giải thuật được thể hiện bằng ví dụ cụ thể

Giả sử có đồ thị có hướng như bên dưới, áp dụng Tarjan để tìm các thành phần liên thông mạnh

Bước thực hiện Diễn giải

Bước 1: Set up các mảng và biến chứa

thông tin về phần tử duyệt trong hàm

MainTarjan và set giá trị đầu tiên cho các

mảng và biến này cho tất cả các đỉnh

- CurrentIndex = 0

- Cho từng đỉnh a của mọi đỉnh trong đồ thị

pointIndex[a] = -1 pointLowIndex[a] = -1 Stack = []

isOnStack[a] = false

- Hàm main có dạng (mã giả)

Trang 5

Bước 2: Chạy hàm Tarjan cho giá trị

đỉnh đầu là 0 duyệt đến hết đồ thị (check đã

duyệt chưa trong mảng pointIndex)

- pointIndex[0] = -1 => Tarjan(0)

Bước 3:

 Xét cho mỗi đỉnh con mà đỉnh đang

chạy Tarjan kết nối với nó

 Nếu đỉnh con chưa đi qua (pointIndex =

-1), chạy Tarjan trên đỉnh con đó

 Nếu đỉnh con đã đi qua (pointIndex ≠

-1) , tìm đỉnh nhỏ nhất mà 2 đỉnh cha

con đó kết nối (min poinLowIndex)

 Khi đã xong việc xét các đỉnh con , tiến

hành so sánh giữa index và lowIndex

để check xem đỉnh đó có phải là đỉnh

nhỏ nhất của một thành phần liên thông

mạnh hay không, từ đó xuất ra các phần

tử trong Stack của thành phần liên

thông mạnh đó

Hàm Tarjan có dạng (mã giả)

Các bước chi tiết tại bước 3

Bước 3.1 - Đỉnh 0 kết nối với 1 => Chạy Tarjan cho 1 ,

pointIndex[0] = -1  Tarjan(1)

pointLowIndex 0 1 -1 -1 -1 -1 -1

Trang 6

Bước 3.2 - Đỉnh 1 kết nối với 2,4,6  Chạy Tarjan cho 2,

pointIndex[2] = -1  Tarjan(2)

Bước 3.3 - Đỉnh 2 kết nối với 3  Chạy Tarjan cho 3,

pointIndex[3] = -1  Tarjan(3)

- Đỉnh 3 kết nối với 2,4

- Xét đỉnh 2 pointIndex[2] ≠ -1  đã có “quay lại’’ tức 2,3 cùng nằm trong 1 thành phần liên thông Cho pointLowIndex[3] = min(pointLowIndex[3], pointIndex[2]) = 2

- Xét đỉnh 4, pointIndex[4] = -1

 Chạy Tarjan cho 4

Trang 7

Bước 3.4 - Đỉnh 4 kết nối với 5  Chạy Tarjan cho 5,

pointIndex[5] = -1  Tarjan(5)

- Đỉnh 5 kết nối với 4

- Xét đỉnh 4 pointIndex[4] ≠ -1  đã có “quay lại’’ tức 4,5 cùng nằm trong 1 thành phần liên thông Cho pointLowIndex[5] = min(pointLowIndex[5], pointIndex[4]) = 4

- Vì sau 5 không có đỉnh con nào khác ngoài 4  kết thúc vòng lặp xét đỉnh con cho 5

- Tiến hành check index và lowIndex của 5 Vì pointIndex[5] = 5

≠ pointLowIndex[5] = 4  End Tarjan cho 5

Bước 3.5 - Sau khi end Tarjan(5)  quay lại Tarjan(4)

- Cho pointLowIndex[4] = min(pointLowIndex[4], pointLowIndex [5]) = 4

- Vì 4 không có đỉnh con nào khác ngoài 5  kết thúc vòng lặp xét đỉnh con cho 4

- Tiến hành check index và lowIndex của 4

Vì pointIndex[4] = pointLowIndex[4] = 4

=> 4 là node nhỏ nhất trong 1 thành

phần liên thông  tiến hành xuất thành phần liên thông 4,5

Xuất thành phần liên thông và end Tarjan cho 4

- Cho w = -1, tăng biến đếm thành phần liên thông

- Xét các phần tử trong stack (từ những phần tử cuối mảng đổ lên), nếu khác 4 thì

Trang 8

1 Cho w = phần tử cuối cùng của stack

2 Tắt false cho w

3 Remove w từ Stack

4 Xuất ra hoặc đưa w vào 1 list các thành phần liên thông đã chuẩn bị sẵn, tăng biến đếm thành phần liên thông

Bước 3.6 - Sau khi end Tarjan(4)  quay lại Tarjan(3)

- Cho pointLowIndex[3] = min(pointLowIndex[3], pointLowIndex [4]) = 2

- Vì 3 không có đỉnh con nào khác ngoài 2,4 => kết thúc vòng lặp xét đỉnh con cho 3

- Tiến hành check index và lowIndex của 3

- Vì pointIndex[3] = 3 ≠ pointLowIndex[3] = 2 => End

Tarjan cho 3.

Trang 9

Bước 3.7 - Sau khi end Tarjan(3)  quay lại Tarjan(2)

- Cho pointLowIndex[2] = min(pointLowIndex[2], pointLowIndex [3]) = 2

- Vì 2 không có đỉnh con nào khác ngoài 3  kết thúc vòng lặp xét đỉnh con cho 2

- Tiến hành check index và lowIndex của 2

- Vì pointIndex[2] = pointLowIndex[2] = 2

=> 2 là node nhỏ nhất trong 1 thành phần liên thông => Tiến hành xuất thành phần liên thông 2,3

Xuất thành phần liên thông và end Tarjan cho 2

- Cho w = -1, tăng biến đếm thành phần liên thông

- Xét các phần tử trong stack (từ những phần tử cuối mảng đổ lên), nếu khác 2 thì

1 Cho w = phần tử cuối cùng của stack

2 Tắt false cho w

3 Remove w từ Stack

4 Xuất ra hoặc đưa w vào 1 list các thành phần liên thông đã chuẩn bị sẵn

Trang 10

Bước 3.8 - Sau khi end Tarjan(2)  quay lại Tarjan(1)

- Cho pointLowIndex[1] = min(pointLowIndex[1], pointLowIndex [2]) = 1  Hoàn thành xét đỉnh 2 cho 1

- Tiến hành xét đỉnh 4, 6

- Vì pointIndex[4] ≠ -1

=> Cho pointIndex[1] = min(pointLowIndex[1], pointIndex [4])

= 1 => Hoàn thành xét đỉnh 4 cho 1

- Vì pointIndex[6] = -1  Chạy Tarjan(6)

- Đỉnh 6 có kết nối với 0 và 2 + Xét 0

pointIndex[0] ≠ -1  Cho poinLowIndex[6] = min(pointLowIndex[6],pointIndex[0]) = 0

+ Xét 2 pointIndex[2] ≠ -1  Cho poinLowIndex[6] = min(pointLowIndex[6],pointIndex[2]) = 0

 Hoàn thành xét đỉnh 0,2 cho 6

- Vì 6 không có đỉnh con nào khác ngoài 0,2 => kết thúc vòng lặp xét đỉnh con cho 6

- Tiến hành check index và lowIndex của 6

- Vì pointIndex[6] = 6 ≠ pointLowIndex[6] = 0 =>

=> End Tarjan cho 6.

Trang 11

Bước 3.9 - Sau khi end Tarjan(6)  quay lại Tarjan(1),

poinLowIndex[1] = min(pointLowIndex[1],pointLowIndex[6])

= 0

- Vì 1 không có đỉnh con nào khác ngoài 2,4,6  kết thúc vòng lặp xét đỉnh con cho 1

- Tiến hành check index và lowIndex của 1

- Vì pointIndex[1] = 1 ≠ pointLowIndex[1] = 0 => End

Tarjan cho 1

Bước 3.10 - Sau khi end Tarjan(1)  quay lại Tarjan(0)

poinLowIndex[0] = min(pointLowIndex[0],pointLowIndex[1]) = 0

- Vì 0 không có đỉnh con nào khác ngoài 1  kết thúc vòng lặp xét đỉnh con cho 0

- Tiến hành check index và lowIndex của 0 Vì pointIndex[0] = pointLowIndex[0] = 0 => 0 là node nhỏ nhất trong 1 thành phần liên thông => tiến hành xuất thành phần liên thông 0,1,6

Xuất thành phần liên thông và end Tarjan cho 0

- Cho w = -1, tăng biến đếm thành phần liên thông

- Xét các phần tử trong stack (từ những phần tử cuối mảng đổ lên), nếu khác 2 thì

1 Cho w = phần tử cuối cùng của stack

2 Tắt false cho w

3 Remove w từ Stack

4 Xuất ra hoặc đưa w vào 1 list các thành phần liên thông đã chuẩn bị sẵn

Trang 12

Bước 3.11 Khi đã end Tarjan 0, tiếp tục các phần tử khác trong vòng for của

hàm Main nếu đồ thì là đồ thị nhiều thành phần liên thông (trong trường hợp ví dụ này cùng nằm trên 1 thành phần liên thông) nên có thể end for trong Main Tarjan

Kết thúc thuật toán

c Đánh giá ưu điểm và khuyết điểm của giải thuật Tarjan

- Chỉ 1 lần duyệt qua DFS, nhanh hơn thuật toán Kosaraju

- Không cần đảo chiều các hướng mũi tên của đồ thị như

Kosaraju

- Dễ áp dụng

- Chỉ xuất ra được kết quả khi tìm được node đỉnh nhỏ nhất của một thành phần liên thông mạnh

- Thứ tự các đỉnh trong thành phần liên thông mạnh tìm ra có thể bị ngược

B NỘI DUNG CÀI ĐẶT

Cho một đồ thị có hướng không có cạnh bội và không có cạnh khuyên Danh sách kề biểu diễn

đồ thị được cho có định dạng như sau:

▪ Dòng đầu tiên chứa số nguyên n (n > 2) thể hiện số đỉnh củà đồ thị

▪ n dòng tiếp theo lần lượt chứa thông tin danh sách kề củà đỉnh 0 đến đỉnh n-1

▪ Danh sách kề của mỗi đỉnh i được biểu diễn bằng mi + 1 số nguyên, trông đó số nguyên đầu tiên là số lượng đỉnh có cạnh nối xuất phát từ đỉnh i (tức là mi) và các số nguyên tiếp theo

là chỉ mục của những đỉnh kề (chỉ mục tính từ 0)

1) Xác định đồ thị được cho là liên thông mạnh, liên thông một phần, liên thông yếu hay không

liên thông Tham khảo Tài liệu [2].

2) Xác định các thành phần liên thông mạnh có trong đồ thị Với mỗi thành phần liên thông, cho

biết chỉ mục củà các đỉnh thuộc về thành phần liên thông đó Tham khảo Tài liệu [3].

0 1

6 2 3

Trang 13

I. Kết quả bài làm

Xác định các loại đồ thị, xác định loại và thành phần liên thông mạnh có trong đồ thị, phần minh họa kết quả xuất

+ Đồ thị liên thông mạnh: (hình 2.1.1)

Hình 2.1.1 + Đồ thị liên thông từng phần (hình 2.1.2)

Trang 14

Hình 2.1.2 + Đồ thị liên thông yếu (hình 2.1.3)

Hình 2.1.3 + Đồ thị không liên thông (hình 2.1.4)

Hình 2.1.4

II Những ghi chú quan trọng

Trang 15

Chương trinh gồm 1 class chính (Program.cs) nơi gọi file.txt và xuất kết quả và các class chức năng Lưu ý copy đường dẫn vào hàm main để chương trình truy xuất vào đúng file (bôi màu vàng)*

*ví dụ đường dẫn: @"D:\VB 2 KHTN\Lý thuyết đồ thị\Bai Tap\Đồ án

01\SOURCE\lienthongtungphan.txt"

Hình 2.1.5 Các class và hàm chức năng gồm có

Program - Hàm Main: Hàm chính chạy chương trình

Graph

Handler - struct AdjacencyList : Kiểu dữ liệu tự định nghĩa cho AdjacenyList

- Hàm InputAndStore : Đọc danh sách kề vào chương trình

- Hàm ConvertToPathMatrix: Chuyển đổi AdjacencyList qua PathMatrix

- Hàm ConvertToUndirectedGraph: Chuyển đổi đồ thị dạng AdjacencyList qua AdjacencyMatrix

DFS - Hàm DFSFindPath, DFSMainFindPath: DFS tìm đường đi

- Hàm DFSFindComponents, DFSPrintComponents, DFSMainFindComponents: DFS xác định liên thông hay không liên thông

Tarjan

(Hình 2.1.7) - Hàm Min: Tìm Min 2 số a,b

- Hàm MainTarJan, TarjanSCC, PrintSCCArr: thuật toán Tarjan xác định thành phần liên thông mạnh

Connected

Component

TypeCheck

(Hình 2.1.6)

- Hàm connectedComponentTypeCheck: hàm chính xác định loại thành phần liên thông

- Hàm strongConnectedComponentCheck, unilaterallyConnectedComponentCheck, noConnectedComponentCheck: check các trường hợp mạnh , từng phần và không liên thông

=> Hàm tổng (connectedComponentTypeCheck) sẽ check loại đồ thị liên thông nếu không phải 3 loại trên sẽ là đồ thị liên thông yếu

Trang 16

Hình 2.1.6

Trang 17

Hình 2.1.7

Ngày đăng: 01/09/2022, 16:57

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w