Professional Documents
Culture Documents
LÝ THUYẾT ĐỒ THỊ
CÁC THUẬT TOÁN TÌM KIẾM
TRÊN ĐỒ THỊ
NỘI DUNG
CHÍNH
Bài toán tìm Đường
đi
BFS
DFS
Phần 3.1
TÌM KIẾM THEO CHIỀU SÂU (Depth
First Search – DFS)
DFS
3. Duyệt đồ thị
v5 v6 v7 v8
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
Bảng duyệt v1 v2 v6 v3 v4 v8 v7 v5
Ví dụ về DFS
• Áp dụng DFS, hãy thể hiện thứ tự duyệt
các đỉnh trong đồ thị sau: u
0 t v
s x
Procedure DFS(u:integer);
Var i:integer;
Begin
For i:=1 to N do
if ok[i] and(A[u,i])then
begin
ok[i]:=false;
DFS(i);
end;
end;
BFS
3. Duyệt đồ thị
v5 v6 v7 v8
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
Bảng duyệt v1 v2 v5 v6 v3 v7 v4 v8
3. Duyệt đồ thị
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9
Cài đặt BFS (tt)
1 2 3
• Đưa 1 vào Queue
• Lấy 1 ra xử lý, đưa 5, 4, 2 vào Queue
• Lấy 2 ra xử lý, đưa 5, 3 vào Queue
• Lấy 4 ra xử lý, đưa 5 vào Queue 4 6
5 6
• Lấy 5 ra xử lý, đưa 3 vào Queue 3
• Lấy 3 ra xử lý. Đưa 6 vào Queue 5
• Lấy 5 ra. Không xử lý (vì đã xử lý rồi) 5 Queue
• Lấy 5 ra. Không xử lý 3
5
• Lấy 3 ra. Không xử lý
4
• Lấy 6 ra xử lý. Không đưa gì vào Queue
1
2
Thứ tự 1 2 4 5 3 6
duyệt:
0 t v
s x
int danhdau[maxV]
void DFS(DOTHI g, int s) // s la dinh xuat phat
{
if (danhdau[s] ==1) return;
cout<<s<<“ da duoc duyet \n“;danhdau[s] = 1;
for (int v = 1; v<=g.nV; v++)
if (danhdau[v] == 0&&g.mtke[s][v]!=0)
DFS(g,v);
}
Lý thuyết đồ thị 05/18/20 19
Áp dụng DFS để kiểm tra
liên thông
• Ý tưởng:
• Áp dụng cho đồ thị vô hướng
• Áp dụng DFS, bắt đầu từ đỉnh bất kỳ, nếu duyệt
qua được tất cả các đỉnh thì đồ thị là liên thông
• Cụ thể:
• Sử dụng thêm biến dem để đếm số đỉnh được
duyệt
• Nếu duyệt xong mà đếm bằng g.nV (số đỉnh của
đồ thị) thì có nghĩa là tất cả các đỉnh được duyệt
Áp dụng DFS để kiểm tra liên thông (tt)
int danhdau[maxV]
void DFS_lt(DOTHI g, int s, int &dem) // s la dinh xuat phat
{
//Khoi tao mang danh dau trong ham main hoac ben ngoai ham nay
cout<<s<<“ da duoc duyet \n“; dem++; danhdau[s] = 1;
for (int v = 1; v<=g.nV; v++)
if (danhdau[v] == 0)
DFS(g,v);
}
int isLienThong(DOTHI g)
{
if (g.type == 1)
return 0; // khong xet do thi co huong
int dem = 0;
for (int v = 1; v<= g.nV; v++)
danhdau[v] = 0;
DFS_lt(g,1,dem);
if (dem == g.nV)
return 1; // do thi lien thong
return 0;
}
Ví dụ về DFS GRAPH.IN GRAPH.OUT
P
8715 1, 2, 3, 5, 4, 6
12 5<- 3<-2<-1
2 4 13
6 23
24
1 35
46
7
78
8
3 5