Tải bản đầy đủ (.ppt) (56 trang)

các thuật tuán về đồ thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (549.14 KB, 56 trang )

CÁC THUẬT TOÁN
TRÊN ĐỒ THỊ
MỤC TIÊU

Một số khái niệm cơ bản

Biểu diễn đồ thị

Duyệt đồ thị

Thành phần liên thông và thành phần liên thông
mạnh

Đồ thị định hướng không có chu trình

Sắp xếp topo

Các thuật toán đồ thị
o
Đường đi ngắn nhất
o
Cây bao trùm ngắn nhất
MỘT SỐ KHÁI NIỆM CƠ BẢN

Đồ thị được sử dụng để mô hình hóa các bài toán
bao gồm một tập các đối tượng có quan hệ với
nhau theo 1 cách nào đó

Ví dụ
o
Một mạng truyền thông


o
Bản đồ đường đi giữa các thành phố

Việc giải quyết các bài toán trở thành việc giải
quyết một bài toán trên đồ thị

Chẳng hạn
o
Tìm đường đi ngắn nhất
o
Tìm cây bao trùm ngắn nhất
o
Tìm các thành phần liên thông…
MỘT SỐ KHÁI NIỆM CƠ BẢN

Một đồ thị định hướng G = <V, E>
o
V là tập các đỉnh, E là tập các cung nối các đỉnh
o
Mỗi cung là một cặp đỉnh có thứ tự (u,v), ký hiệu u->v
o
Nếu có cung (u,v) ta nói đỉnh v kề với đỉnh u
u v
a b
c d
Một cung của đồ thị
Đồ thị định hướng
MỘT SỐ KHÁI NIỆM CƠ BẢN

Một đồ thị vô hướng G = <V, E>

o
V là tập các đỉnh, E là tập các cạnh nối các đỉnh
o
Mỗi cạnh là một cặp đỉnh không có thứ tự (u,v)
o
Nếu có cạnh (u,v) ta nói đỉnh u và v kề nhau
u v
a b
c d
e
Một cạnh của đồ thị
Đồ thị vô hướng
MỘT SỐ KHÁI NIỆM CƠ BẢN

Đồ thị có trọng số
o
Đồ thị mà mỗi cung/cạnh của đồ thị được gắn với một số
c(u,v)
o
Số c(u,v) được gọi là trọng số (giá/độ dài) của cung/cạnh (u,v)

Đường đi đơn
o
Là một dãy hữu hạn các đỉnh (v0, v1, …, vk) khác nhau, ngoại
trừ có thể v0 = vk, và vi+1 là đỉnh kề của vi (i=1,2…k-1)
o
Với đồ thị có trọng số độ dài đường đi được tính là tổng trọng
số trên các cạnh trên đường đi
o
Với đồ thị không có trọng số độ dài đường đi là k

MỘT SỐ KHÁI NIỆM CƠ BẢN

Đồ thị đơn
Là đồ thị vô hướng có nhiều nhất một cạnh nối hai đỉnh
Là đồ thị vô hướng mà hai đỉnh có thể được nối bởi nhiều
hơn một cạnh

Đa đồ thị
MỘT SỐ KHÁI NIỆM CƠ BẢN

Chu trình
o
Là đường đi khép kín, tức là đường đi (v0, v1, …, vk) có v0 =
vk

Ví dụ
o
Trong đồ thị định hướng dưới đây thì (v4, v1, v2, v3) là một
đường đi từ v4 đến v3, và (v4, v1, v2, v4) là một chu trình
v1 v2
v4v3
MỘT SỐ KHÁI NIỆM CƠ BẢN

Đồ thị con
o
Đồ thị G’=<V’, E’> là đồ thị con của G=<V, E> nếu V’ V và E’ E

Ví dụ
v1 v2
v4v3

v1 v2
v4
Đồ thị con
Đồ thị
BIỂU DIỄN ĐỒ THỊ

Để giải quyết các vấn đề của đồ thị, cần lưu trữ
đồ thị trong bộ nhớ máy tính, vì thế cần phải biểu
diễn CTDL của đồ thị.

Có hai cách biểu diễn
o
Biểu diễn bằng ma trận kề (lưu trữ đồ thị bằng mảng hai
chiều)
o
Biểu diễn bằng danh sách kề (lưu trữ đồ thị bằng danh
sách móc nối)
BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ

Với đồ thị không có trọng số G=<V,E>, với V={v1, v2, …, vn},
được lưu trữ trong mảng hai chiều A[1 n][1 n] trong đó:

A[i,j] =

Ví dụ: cho đồ thị vô hướng
1. Nếu (vi, vj) có cạnh nối
0 Nếu (vi, vj) không có cạnh nối
1 2
3 4
5

Đồ thị vô hướng
0 1 1 1 0
1 0 0 1 1
1 0 0 1 0
1 1 1 0 1
0 1 0 1 0
Mảng biểu diễn đồ thị
BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ

Với đồ thị không có trọng số G=<V,E>, với V={v1, v2, …, vn},
được lưu trữ trong mảng hai chiều A[1 n][1 n] trong đó:

A[i,j] =

Ví dụ 1: cho đồ thị vô hướng
1. Nếu (vi, vj) có cung/cạnh nối
0 Nếu (vi, vj) không có cung/cạnh nối
1 2
3 4
5
Đồ thị vô hướng
0 1 1 1 0
1 0 0 1 1
1 0 0 1 0
1 1 1 0 1
0 1 0 1 0
Mảng biểu diễn đồ thị
BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ

Ví dụ 2: cho đồ thị định hướng


Nhận xét:

Ưu điểm: Với 2 đỉnh bất kỳ ta biết ngay rằng có cung/cạnh nối
hay không trọng số của cung/cạnh đó (nếu là đồ thị trọng số)

Nhược điểm: Lãng phí bộ nhớ (do chỉ có một số cung/cạnh)
1 2
3 4
5
Đồ thị định hướng
0 1 0 1 0
0 0 0 1 1
1 0 0 0 0
0 0 1 0 0
0 0 0 1 0
Mảng biểu diễn đồ thị
BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ

Với đồ thị có trọng số G=<V,E>, với V={v1, v2, …, vn}, với c(vi,
vj) là trọng số trên cung/cạnh (vi, vj), khi đó:

A[i,j] =

Ví dụ 1: cho đồ thị định hướng
c (vi, vj) Nếu (vi, vj) có cung/cạnh nối
0 Nếu (vi, vj) không có cung/cạnh nối
0 12 0 10 0
0 0 0 5 25
9 0 0 0 0

0 0 6 0 0
0 0 0 27 0
Mảng biểu diễn đồ thị
1 2
3 4
5
Đồ thị định hướng
12
10
25
27
6
9
5
BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH KỀ

Cách biểu diễn
o
Với mỗi đỉnh, lập một danh sách các đỉnh kề với nó
o
Danh sách các đỉnh kề là một danh sách móc nối
o
Mỗi thành phần trong danh sách gồm số hiệu đỉnh, trọng số
của cung/cạnh nối
o
Sử dụng mảng A[1 n], trong đó A[i] là con trỏ trỏ tới đầu
danh sách các đỉnh kề của đỉnh thứ I

Nhận xét:
o

Ưu điểm: Tiết kiệm bộ nhớ
o
Nhược điểm: muốn biết có cung/cạnh (vi, vj) hay không (và
trọng số của nó) ta phải duyệt danh sách các đỉnh kề của vi.
BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH KỀ

Ví dụ :
cho đồ thị định hướng
1 2
3 4
5
Đồ thị định hướng
12
10
25
27
6
9
5
2 12
4 51 9
2
1
3
4
5
4 10
5 25
3 6
4 27

Mảng các danh sách kề
Mảng A
BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH KỀ

Cấu trúc dữ liệu
#define N 100
struct node
{
unsigned int index; //số hiệu đỉnh
float cost; //trọng số cung/cạnh
struct node *next;
};
typedef struct member *node;
member A[N];
TÌM KIẾM TRÊN ĐỒ THỊ

Có hai phương pháp
o
Tìm kiếm theo chiều rộng – Breath First Search
o
Tìm kiếm theo chiều sâu – Depth First Search
TÌM KIẾM THEO CHIỀU RỘNG

Chọn một đỉnh u và thăm đỉnh đó

Từ đỉnh u lần lượt thăm các đỉnh v kề u và chưa được
thăm.

Đỉnh v nào được thăm trước thì các đỉnh kề nó cũng
được thăm trước


Quá trình trên được tiếp tục cho tới khi không thể đến
thăm đỉnh nào nữa.
TÌM KIẾM THEO CHIỀU RỘNG

Ví dụ: cho đồ thị
1 2
3 4
5
6 7
9 8

Xuất phát từ đỉnh 1
1
2
3
4
5
6
7
9
8

Quá trình đi thăm từ
đỉnh u sẽ tạo ra cây
gốc u
TÌM KIẾM THEO CHIỀU RỘNG

Thuật toán
o

Cho G=<V, E> với V={1, 2, n}
o
Sử dụng hàng đợi Q để lưu các đỉnh đã được thăm
nhưng chưa thăm các đỉnh kề của nó
o
Sử dụng mảng father[1 n] để lưu lại vết của đường đi
xuất phát từ đỉnh u, father[w] = v nếu w được thăm từ v.
Ban đầu mảng father được khởi tạo giá trị -1
o
Danh sách các đỉnh kề của v ký hiệu là Adj(v)
TÌM KIẾM THEO CHIỀU RỘNG
Procedure BFS(u)
{

Father[u]=0;

Creat(Q);

Add(Q,u);

While not empty(Q) Do

{ Del(Q,v);

For mỗi w trong Adj(v) Do

if father[w]= -1 then

{ father[w]=v;


Add(Q,w);

}

}
}
TÌM KIẾM THEO CHIỀU RỘNG
Procedure BreathTravelsal(G)
{

for u=1 to n do father[u]=-1;

for u=1 to n do

if father[u]=-1 then BFS(u);
}
Chú ý: nếu G là đồ thị không có trọng số thì khi gọi thủ tục
BFS(u) tìm ra đường đi ngắn nhất từ u đến các đỉnh có thể đạt tới
từ u, sử dụng mảng father để xây dựng đường đi ngắn nhất tìm ra.
TÌM KIẾM THEO CHIỀU SÂU

Xuất phát từ đỉnh u được thăm

Thăm đỉnh w là đỉnh kề của u chưa được thăm

Tìm kiếm theo chiều sâu xuất phát từ w

Khi một đỉnh v đã được thăm mà mọi lân cận của nó đã được
thăm, phép tìm kiếm quay lại đỉnh cuối cùng vừa được thăm
mà đỉnh kề w của nó chưa được thăm, một phép tìm kiếm

theo chiều sâu xuất phát từ w được thực hiện.
TÌM KIẾM THEO CHIỀU SÂU

Ví dụ: cho đồ thị
1 2
3 4
5
6 7
9 8

Xuất phát từ đỉnh 1

Thứ tự các đỉnh được thăm:
1, 2, 4, 3 (quay lại 2), 5, 6, 7, 8, 9

×