- Phân nhóm đỉnh kề rõ ràng
Tìm số thành phần liên thông
Hãy cho biết đồ thị có bao nhiêu thành phần liên thông và mỗi thành phần liên thông gồm những đỉnh nào?
Ý tưởng:
Do số thành phần liên thông bằng số lần DFS() gọi DFS1() hoặc BFS() gọi BFS1(), nên ta dùng biến stplt để đếm số thành phần liên thông, mỗi lần DFS() gọi DFS1() hoặc BFS() gọi BFS1() ta tăng biến stplt lên 1.
Khi thăm v thay vì gán thăm[v] = true (=1) ta gán thăm[v] = stplt (số hiệu thành phần liên thông chứa v).
5050 50
Thuật toán:
void DFS1(v) //duyệt một thành phần liên thông
{ Tham_Dinh(v);
tham[v]=stplt; //ghi nhận là đã thăm v để về sau không thăm nữa.
For (u ∈ Ke(v)) // xét tất cả các đỉnh u kề với v
If(!tham[u])
DFS1(u); //neu u chua thăm, thăm u
}
void DFS() //duyệt tất cả các thành phần liên thông
{ for (v ∈V) tham[v]=0; //ban đầu tất cả các đỉnh đều chưa thăm.
stplt=0;
for (v ∈ V) //xét tất cả các dinh
if (!tham[v]) {
stplt++;
DFS1(v); // neu đỉnh v chua tham thi tham v
}} }
void BFS1(v) //duyệt một thành phần liên thông
{
queue=∅; //khoi tạo hàng đợi rỗng
push(queue,v); //cất v vào hàng đợi
tham[v]=stplt; //ghi nhận là đã thăm v để về sau không thăm nữa.
while (queue) // trong khi hàng đợi còn khác rỗng
{ v=pop(queue); //lay v từ hàng đợi
Tham_Dinh(v);
for (u ∈ Ke(v)) // xét các đỉnh u kề với v
if (!tham[u]) //nếu u chưa thăm
{ push(queue,u); //cất u vào hàng đợi
tham[u]=stplt; //ghi nhan u tham roi
}} }
}
52