Professional Documents
Culture Documents
Chuong 3 DFS BFS
Chuong 3 DFS BFS
DFS BFS
Phần 3.1
v1 v2 v3 v4
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
0 t v
s x
Procedure init;
Begin
fillchar(a,sizeof(a),false);
fillchar(Free,sizeof(Free),true);
end;
Lý thuyết đồ thị 05/18/20 9
Code pascal DFS
Procedure readf;
Var i, u, v : integer;
Begin
readln(n,m,s);
for i := 1 to m do
begin
readln(u,v); A[u,v] := true; A[v,u] := true;
end;
end;
Procedure DFS(u : integer);
Var v : integer;
Begin
writeln(u);
Free[u] := false;
For v := 1 to n do
If A[u,v] and Free[v] then
dfs(v); Trace[v] := u;
end;
{Lưu vết đường đi cũng là đánh dấu v đã thăm}
#define N 100005
int n, m, cnt;
vector<int> a[N];
int Visited[N], Parent[N];
v1 v2 v3 v4
v5 v6 v7 v8
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
Bảng duyệt v1 v2 v5 v6 v3 v7 v4 v8
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 5 6
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ý 5 Queue
rồi)
3
Lấy 5 ra. Không xử lý
5
Lấy 3 ra. Không xử lý
4
Lấy 6 ra xử lý. Không đưa gì vào
1
2
Queue
Thứ tự duyệt: 1 2 4 5 3 6
Lý thuyết đồ thị 05/18/20 21
Ví dụ về BFS
0 t v
s x
Procedure main;
Var i : integer;
Begin
init;
readf;
BFS(s);
end;
BEGIN
main;
END.
#include <bits/stdc++.h>
using namespace std;
int a[101][101];
queue <int> q;
int n,m,Free[101], u,v,s;
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector<int> a[2309];
int d[2309]; //one-based
int n, m;
while (qu.size()) {
u = qu.front();
qu.pop();
for (int i = 0; i < a[u].size(); i++) {
int v = a[u][i];
if (d[v] == 0) {
d[v] = d[u] + 1;
qu.push(v);
}
}
}
}thuyết đồ thị
Lý 05/18/20 31
Code C++ BFS: Danh sách kề
int main() {
scanf("%d%d", &n, &m);
while (m--) {
int p, q;
scanf("%d%d", &p, &q);
a[p].push_back(q);
a[q].push_back(p); // remove it in one-
directional graph
}
bfs();
printf(" i : ");
for (int i = 1; i <= n; i++)
printf("%3d,", i);
printf("\n");
printf("d[i] : ");
for (int i = 1; i <= n; i++)
printf("%3d,", d[i]);
printf("\n");
} Lý thuyết đồ thị 05/18/20 32
Phần 3.3
2 4 GRAPH.INP GRAPH.OUT
6
8715 1, 2, 3, 5, 4, 6
12 5<- 3<-2<-1
1 13
7 23
24
35
8 46
78
3 5
GRAPH.INP GRAPH.OUT
2 4
6 8715 1, 2, 3, 5, 4, 6
12 5<- 3<-2<-1
13
1 23
7 24
35
8 46
3 5 78
#define N 100005
int n, m, cnt;
vector<int> a[N];
int Visited[N], Parent[N];
void visit(int u) {
cout << "Visiting " << u << endl;
Visited[u] = ++cnt; // travesal time
for (int i = 0; i < a[u].size(); i++) {
int v = a[u][i];
if (v != Parent[u]) {
if (!Visited[v]) {
Parent[v] = u;
visit(v);
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int p, q;
cin >> p >> q;
/*do {
p=rand()%n+1;
q=rand()%n+1;
} while (p==q);
cout << p << " " << q << endl;*/
a[p].push_back(q);
a[q].push_back(p);
}
for (int i = 1; i <= n; i++) if (!Visited[i]) visit(i);
cout << "Travesal time: " << endl;
for (int i = 1; i <= n; i++) cout << Visited[i] << " ";
cout << endl;
cin.ignore(2);
}