9
1-VHA
Lý Thuyết Đồ Thị
HƯỚNG DẪN THỰC HÀNH TUẦN 2
DUYỆT VÀ TÌM CÁC THÀNH PHẦN LIÊN THÔNG.
I. Đồ thị liên thông:
Đồ thị liên thông là đồ thị chỉ có một thành phần liên thông.
Các thuật toán được sử dụng:
− DFS (Depth First Search).
− BFS (Breadth First Search)
1. Thuật toán DFS
Bước 1 Khởi đầu
L={0, 0, 0, 0, 0}
S={1}
P={
φ
}
9
2-VHA
Lý Thuyết Đồ Thị
Bước 2
S={4}
P={1}
Bước 3
S={2}
P={1,4}
Bước 5
S={5}
P={1,4,2}
Bước 6
S={3}
P={1,4,2,5}
9
3-VHA
Lý Thuyết Đồ Thị
Bước 7
S={
φ
}
P={1,4,2,5,3}
2.1 Cài đặt:
Đệ Quy
Thủ tục Visit(đỉnh i, nhãn label)
Gán nhãn label cho đỉnh i
Với mọi đỉnh j mà có cạnh nối với i
Nếu j có nhãn 0 thì
Gọi đệ quy Visit(j, label)
Cuối với mọi.
Cuối thủ tục.
Thủ tục Đối tượng
void visit(int **a,int label,
int n, int b[], int u)
{
//…
}
void DFS( int **a,int n)
{
int b[MAX];//mang chua
nhan cua dinh
//nhan dinh tuong ung
la 0
for(int i=0;i<n;i++)
b[i]=0;
class CConnectComponents
{
private:
int NComponents;
int label[MAX];
public:
CConnectComponents(void);
~CConnectComponents(void);
void DFS(GRAPH g);
void visit(int u, int
label,GRAPH g);
};
9
4-VHA
Lý Thuyết Đồ Thị
int tp=1;
//…
}
Cài đặt không đệ quy:
<Thăm S, đánh dấu S đã thăm>;
<Đẩy S vào ngăn xếp>; // Dây chuyền đệ quy ban đầu chỉ có một đỉnh S
do {
<Lấy u khỏi ngăn xếp>; // Đang đứng ở đỉnh u
if <u có đỉnh kề chưa thăm>
{
<Chỉ chọn lấy 1 đỉnh v, là đỉnh đầu tiên kề u mà chưa được thăm>;
<Thông báo thăm v>;
<Đẩy u trở lại ngăn xếp>; // Giữ lại địa chỉ quay lui
<Đẩy tiếp v vào ngăn xếp>; // Dây chuyền duyệt sâu được "nối" thêm v
nữa
}
// Còn nếu u không có đỉnh kề chưa thăm thì ngăn xếp sẽ ngắn lại, tương ứng
với quá trình lùi về của dây chuyền DFS
} while <Ngăn xếp khác rỗng>;
9
5-VHA
Lý Thuyết Đồ Thị
2. Thuật toán BFS
Queue:
φ
Queue: 1
Queue:
φ
Queue: 2 3
Queue: 2 3
9
6-VHA
Lý Thuyết Đồ Thị
Queue: 3
Queue: 3 4
Queue:4
Queue: 5
9
7-VHA
Lý Thuyết Đồ Thị
Queue:
φ
Queue:
φ
Cài đặt
int a[max][max]; // Ma trận kề của đồ thị
int Free[max]; // Free[v] = 0 v chưa được thăm đến ⇔
int Queue[max];
int n, S, F, First, Last;
void Push(int V) // Đẩy một đỉnh V vào hàng đợi
{
Last++;
Queue[Last] = V;
}
int Pop() // Lấy một đỉnh khỏi hàng đợi, trả về trong kết quả hàm
{
int x = Queue[First];
First++;
return x;
}
9
8-VHA
Lý Thuyết Đồ Thị
void BFS() // Thuật toán tìm kiếm theo chiều rộng
{
int u, v;
Queue[1] = S; // Hàng đợi chỉ gồm có một đỉnh S
Last = 1;
First = 1;
do {
u = Pop; // Lấy một đỉnh u khỏi hàng đợi
for (v = 1; v<=n; v++)
if (// có cạnh nối với u và chưa được gán nhãn )
{
// Đưa v vào hàng đợi để chờ thăm
// Thăm v, đánh dấu v đã thăm
}
} while (First<=Last); // Còn thực hiện khi hàng đợi khác rỗng
}
II. Bài Tập
Cho đồ thị G= (V, U) tìm các thành phần liên thông của đồ thị G, hãy sử dụng lại phần
hướng dẫn thực hành tuần 1.
− Viết chương trình xuất ra file kiểm tra đồ thị có liên thông hay không ? Nếu có
xuất ra ’LIENTHONG’ ngược lại ‘KHONGLIENTHONG’, trường hợp đồ thị có thành
phần liên thông thì xuất ra có bao nhiêu thành phần liên thông và các đỉnh tương
ứng với từng thành phần liên thông đó theo thứ tự thành phần liên thông nào có ít
đỉnh nhất in ra trước, nếu hai thành phần liên thông có cùng số đỉnh , thì thành
phần liên thông nào có đỉnh nhỏ hơn sẽ được in ra trước.
Dùng thuật toán duyệt theo chiều sâu DFS (Depth First Search).
− Đệ quy.
− Không đệ quy.
Dùng thuật toán duyệt theo chiều sâu BFS (Breadth First Search).
− Đệ quy.
− Không đệ quy.
9
9-VHA
Lý Thuyết Đồ Thị
Tài liệu tham khảo :
[1.] Huỳnh Lê Tấn Tài, Bài tập thực hành Lý thuyết đồ thị, Khoa CNTT-TUD,
ĐH Tôn Đức Thắng.
[2.] Bài tập thực hành Lý thuyết đồ thị, Khoa CNTT, ĐH Khoa Học Tự Nhiên.