Tìm các thành phần liên thông của đồ thị

Một phần của tài liệu TỔNG QUAN VỀ THUẬT TOÁN VÀ PHƯƠNG PHÁP ĐẾM BM Công nghệ thông tin. Bài giảng Cơ sở toán học cho tin học. (Trang 25 - 28)

• Hãy cho biết đồ thị gồm bao nhiêu thành phần liên thông và từng thành phần liên thông của nó là gồm những đỉnh nào.

– Do thủ tụcDFS(v) (BFS(s))cho phép thăm tất cả các đỉnh thuộc cùng một thành phần liên thông với s, nên số thành phần liên thông của đồ thị bằng số lần gọi đến thủ tục này. – Vấn đề còn lại là cách ghi nhận các đỉnh trong từng thành

phần liên thông.

– Ta dùng thêm biếnIndex[v]để ghi nhận chỉ số của thành phần liên thông chứa đỉnh v, và biếnInconnectđể đếm số thành phần liên thông (khởi tạo giá trị 0)

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 145 Tìm đường đi và kiểm tra tính liên thông

• Thủ tục Tham_dinh(v) trong các thủ tụcDFS(v)vàBFS(v)có nhiệm vụ gán:

Index[v] = Inconnect;

• Câu lệnh if trong các chương trình chính gọi đến các thủ tục này cần được sửa lại như sau:

Inconnect = 0; if (Da_tham[v]==FALSE) { Inconnect = Inconnect+1; DFS(v);//BFS(v) } • Kết thúc vòng lặp thứ hai trong chương trình chính, Inconnect trả về số thành phần liên thông của đồ thị, biến mảngIndex[v], v∈V cho phép liệt kê các đỉnh thuộc cùng một thành phần liên thông

b) Tìm các thành phần liên thông của đồ thị

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 146

• Bài toán:Hỏi đồ thị có hướngGcó là liên thông mạnh?

• Mệnh đề:Đồ thị có hướng G=(V,E)là liên thông mạnh khi và chỉ khi luôn tìm được đường đi từ một đỉnh v đến tất cả các đỉnh còn lại và luôn tìm được đường đi từ tất cả các đỉnh thuộc V\ {v}đến v.

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 147 Kiểm tra tính liên thông mạnh

• ChọnvVlà một đỉnh tuỳ ý.

• Thực hiện DFS(v) trênG. Nếu tồn tại đỉnhukhông được thăm thì G không liên thông mạnh và thuật toán kết thúc. Trái lại thực hiện tiếp

• Thực hiện DFS(v) trênGT = (V, 𝐸 ), với𝐸 thu được từE bởi việc đảo ngược hướng các cung. Nếu tồn tại đỉnh u không được thăm thìG không liên thông mạnh, nếu trái lạiGlà liên thông mạnh.

• Thời gian tính:O(|V|+|E|)

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 148 Thuật toán kiểm tra tính liên thông mạnh

a d a d

c f c f

b e b e

Đồ thịG Đồ thị𝐺

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 149 Thuật toán kiểm tra tính liên thông mạnh

• Bài toán:Cho đồ thị vô hướng liên thôngG= (V, E). Hãy tìm cách định hướng các cạnh của nó để thu được đồ thị có hướng liên thông mạnh hoặc trả lời Glà không định hướng được.

• Thuật toán định hướng : Trong quá trình thực hiện DFS(G) định hướng các cạnh của cây DFS theo chiều từ tổ tiên đến con cháu, các cạnh ngược theo hướng từ con cháu đến tổ tiên. Ký hiệu đồ thị thu được làG()

• Bổ đề. Glà định hướng được khi và chỉ khiG() là liên thông mạnh

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 150 Định hướng đồ thị

a d a d

c f c f

b e b e (adsbygoogle = window.adsbygoogle || []).push({});

Đồ thịG Đồ thịG()

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 151 Ví dụ: Định hướng đồ thị

• Trong phần này, giới thiệu về giải thuật tìm đường đi ngắn nhất giữa 2 đỉnh trên đồ thị có trọng số. • Nội dung gồm:

– Giới thiệu về bài toán – Thuật toán gán nhãn – Thuật toán Dijkstra

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 152 Tìm đường đi ngắn nhất

• Xét đồ thị G = (V, E) với |V| = n, |E| = m

• Với mỗi cạnh u, v∈E, có một giá trị trọng số A(u,v)

• Đặt A(u,v) = ∞ nếu u, v∉E

• Nếu dãy𝑣 ,𝑣,...,𝑣 là một đường đi trên G thì

–∑ 𝐴( 𝑣 ,𝑣) được gọi là độ dài của đường đi

• Bài toán: Tìm đường đi ngắn nhất từ đỉnh s đến đỉnh t của đồ thị G

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 153 Bài toán tìm đường đi ngắn nhất

• Thuật toán được mô tả như sau:

– Từ ma trận trọng số A(u,v), u,v∈V, tìm cận trên d[v] của khoảng cách từ s đến tất cả các đỉnh v∈V.

– Nếu thấy d[u] + A(u,v) < d[v] thì d[v] = d[u] + A(u,v) (làm tốt lên giá trị của d[v])

– Quá trình sẽ kết thúc khi không thể làm “tốt lên” được nữa – Khi đó d[v] sẽ cho ta giá trị ngắn nhất từ đỉnh s đến đỉnh v. – Giá trị d[v] được gọi là nhãn của đỉnh v

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 154 Thuật toán gán nhãn

• Tìm đường đi ngắn nhất từ A đến Z trong đồ thị G sau

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 155 Thuật toán gán nhãn – Ví dụ A B Z F C H 7 4 3 6 5 E D I

• Các bước thực hiện của giải thuật: – Bước 1: Gán cho nhãn đỉnh A là 0, d[A] = 0;

– Bước 2: Chọn cạnh có độ dài nhỏ nhất xuất phát từ A (cạnh AC), gán nhãn của đỉnh kề C với:

– d[C] = d[A] + A(A,C) = 0 + 5 = 5

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 156 Thuật toán gán nhãn – Ví dụ A B Z F C H 7 4 3 6 5 E D I

• Bước 3: Tiếp đó, trong số các cạnh đi từ một đỉnh có nhãn là A hoặc C tới một đỉnh chưa được gán nhãn, chọn cạnh sao cho: nhãn của đỉnh + với trọng số cạnh tương ứng = nhỏ nhất gán cho nhãn của đỉnh cuối của cạnh

• Như vậy, ta lần lượt gán được các nhãn như sau:

d[B] = 6 vì d[B]<d[C]+A[C,B] = 5+4; d[E] = 8;

• Tiếp tục làm như vậy cho tới khi đỉnh Z. Nhãn của Z là độ dài đường đi ngắn nhất từ A đến Z. Thuật toán gán nhãn – Ví dụ

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 157 A B Z F C H 7 4 3 6 5 E D I

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 158 Thuật toán gán nhãn – Ví dụ

• Các bước được mô tả như trong bảng sau: (adsbygoogle = window.adsbygoogle || []).push({});

– Nhưvậy, độdài đường đi ngắn nhất từA đến Z là 18. – Đường đi ngắn nhất từA đến Z qua các đỉnh: A → C → D → I → Z

Bước Đỉnh được gán nhãn Nhãn các đỉnh Đỉnh đã dùng đểgán nhãn Khởi tạo A 0 1 C 0 + 5 = 5 A 2 B 0 + 6 = 6 A 3 E 0 + 8 = 8 A 4 D 5 + 4 = 9 C 5 F 6 + 7 = 13 B 6 H 8 + 6 = 14 E 7 I 9 + 6 = 15 D 8 Z 15 + 3 = 18 I A B Z F C H 7 4 3 6 5 E D I

• Thuật toán này do E.Dijkstra, nhà toán học người Hà Lan, đề xuất năm 1959.

• Thuật toán tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại được Dijkstra đề nghị áp dụng cho trường hợp đồ thị có hướng với trọng số không âm.

• Thuật toán được thực hiện trên cơ sở gán tạm thời cho các đỉnh. • Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn

nhất tới đỉnh đó.

• Các nhãn này sẽ được biến đổi (tính lại) nhờ một thủ tục lặp, mà ở mỗi bước lặp một số đỉnh sẽ có nhãn không thay đổi, nhãn đó chính là độ dài đường đi ngắn nhất từ s đến đỉnh đó

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 159 Thuật toán Dijkstra

voidDijkstra(void)

//Đầu vào G =(V, E) với n đỉnh có ma trận trọng số A(u,v)>=0; s∈V //Đầu ra là khoảng cách nhỏ nhất từ s đến các đỉnh còn lại d[v]:v∈V //Truoc[v]: ghi lại đỉnh trước v trong đường đi ngắn nhất từ s đến v

{

//Bước 1: Khởi tạo nhãn tạm thời cho các đỉnh for( v∈V ){ d[v] = A(s,v); truoc[v]=s; } d[s]=0; T = V\{s}; //T là tập đỉnh có nhãn tạm thời //Bước lặp while(T !=Ø){ Tìm đỉnh u∈T sao cho d[u] = min { d[z] | z∈T}; T= T\{u}; //cố định nhãn đỉnh u*/ for( v∈T ){ //Gán lại nhãn cho các đỉnh trong T if(d[v] > d[u] + A(u,v)){ d[v] = d[u] + A(u,v); truoc[v] =u; } } } }

Giả mã của giải thuật Dijkstra

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 160

–O(mlogn) Borůvka,Prim, Dijkstra, Kruskal,… –O(mlog logn) Yao (1975), Cheriton-Tarjan (1976) –O(m(m,n)) Fredman-Tarjan (1987)

–O(mlog(m,n))Gabow-Galil-Spencer-Tarjan (1986) –O(m(m,n)) Chazelle (JACM2000)

– Optimal Pettie-Ramachandran (JACM2002)

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 161 Độ phức tạp thuật toán

• Trình bày các khái niệm: Đồ thị, Bậc của đỉnh, đồ thị liên thông, đồ thị có hướng?

• Cách biểu diễn đồ thị?

• Chu trình Euler, chu trình Hamilton?

• Cho đồ thị G? Hỏi G có Chu trình Euler, chu trình Hamilton không? • Cho đồ thị G gồm các đỉnh hoặc dưới dạng ma trận trọng số. Tìm

đường đi ngắn nhất giữa 2 đỉnh bất kỳ của đồ thị?

21/07/20 Bộ môn CNTT - Bài giảng Cơ sở toán học cho tin học 162 Câu hỏi và Bài tạp chương 4

Một phần của tài liệu TỔNG QUAN VỀ THUẬT TOÁN VÀ PHƯƠNG PHÁP ĐẾM BM Công nghệ thông tin. Bài giảng Cơ sở toán học cho tin học. (Trang 25 - 28)