GIỚI THIỆU

• Đồ thị là một cấu trúc dữ liệu trừu tượng dựa trên các khái niệm

toán học về đồ thị.

• Đồ thị được xem là tổng quát hóa của cấu trúc cây. Tuy nhiên, đồ thị có mối quan hệ phức tạp hơn là quan hệ cha-con trong cấu trúc cây.

• Đồ thị được sử dụng trong nhiều ứng dụng như cây gia phả,

mạng quản lý chuyến bay v.v…

3

KHOA CÔNG NGHỆ THÔNG TIN

GIỚI THIỆU

• Một đồ thị G là một tập hợp không có thứ tự (V, E), trong đó

V : là các đỉnh của đồ thị

E : là các cạnh (cung) biểu diễn mối quan hệ giữa các đỉnh

V(G) = {A, B, C, D, E}

A B C

E(G) = {(A, B), (A, D), (B, C}, (B, D), (C, E), (D, E)}

D

E

4

KHOA CÔNG NGHỆ THÔNG TIN

GIỚI THIỆU

• Một đồ thị G có thể có hướng hoặc vô hướng.

• Nếu đồ thị có hướng thì cạnh nối hai đỉnh có mũi tên đại diện

cho hướng nối.

Đồ thị có hướng

Đồ thị vô hướng

D

E

D

E

A B C C A B

5

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 1. SỬ DỤNG MA TRẬN KỀ

• Hai đỉnh kề nhau nếu có cạnh nối giữa chúng

• Ta dùng một ma trận với dòng, cột biểu diễn cho các đỉnh của

đồ thị.

• Biểu diễn cạnh trên ma trận kề

Nếu đỉnh i kề đỉnh j

1

𝑎𝑖𝑗 =

0

Ngược lại

6

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 1. SỬ DỤNG MA TRẬN KỀ

C

B

C

A

B

A

A B C D E

A B C D E

A

0

1

0

1

0

0

A

0

1

1

0

B

1

0

1

1

0

0

B

0

0

1

0

C 0

1

0

0

1

0

C 0

1

0

0

D 1

1

0

0

1

0

D 0

0

0

1

E

0

0

1

1

0

1

E

0

0

0

0

D E D E

7

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 1. SỬ DỤNG MA TRẬN KỀ

C

A

B

5 4

2

7

Đồ thị có trọng số là đồ thị mà có gán dữ liệu trên mỗi cạnh.

1

3

A B C D E

D E

Biểu diễn đồ thị có trọng số

A

0

4

0

0

2

B

0

0

0

0

7

C 0

5

0

0

0

D 0

0

3

0

0

E

0

0

0

1

0

8

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 1. SỬ DỤNG MA TRẬN KỀ

A

B

C

5 4

2

7

• Đối với đồ thị đơn (không có vòng), ma trận kề có đường chéo chính mang giá trị 0

1

D E

• Ma trận kề đồ thị vô hướng thì đối

3

xứng

A B C D E

4

A

0

0

2

0

• Bộ nhớ của ma trận kề là O(n2), n là

0

B

0

0

7

0

số đỉnh của đồ thị.

5

C 0

0

0

0

0

D 0

0

0

3

0

E

0

1

0

0

9

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 2. SỬ DỤNG DANH SÁCH KỀ

• Danh sách kề gồm các đỉnh của đồ thị V(G).

• Mỗi đỉnh vi là một danh sách liên kết lưu trữ những đỉnh vj , vj+1,

… nối tới vi

• Thường dùng để lưu đồ thị nhỏ và vừa.

• Biểu diễn đồ thị thưa (có ít cạnh nối) trong bộ nhớ máy tính.

10

KHOA CÔNG NGHỆ THÔNG TIN

BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH 2. SỬ DỤNG DANH SÁCH KỀ

• Danh sách kề biểu diễn đồ thị vô hướng.

NULL

B

D

A

B

NULL

A

C

NULL

B

E

C

A B C

NULL

D

A

B

E

NULL

C

D

D E

11

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

• Duyệt theo chiều rộng (Breadth-First Search) đồ thị vô hướng.

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

C A B

D E

12

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

• Duyệt theo chiều rộng (Breadth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A B2: Đi qua đỉnh B, D

B A

D

13

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

• Duyệt theo chiều rộng (Breadth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A B2: Đi qua đỉnh B, D B3: Xuất phát từ đỉnh B B4: Đi qua đỉnh C

A B C

D

14

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

• Duyệt theo chiều rộng (Breadth-First Search) đồ thị vô hướng.

A B C

B1: Xuất phát từ đỉnh A B2: Đi qua đỉnh B, D B3: Xuất phát từ đỉnh B B4: Đi qua đỉnh C B5: Xuất phát từ đỉnh D

D

15

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

• Duyệt theo chiều rộng (Breadth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A

B2: Đi qua đỉnh B, D

B3: Xuất phát từ đỉnh B

A B C

B4: Đi qua đỉnh C

B5: Xuất phát từ đỉnh D

B6: Đi qua đỉnh E

Dừng thuật toán

D E

16

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

GIẢI THUẬT : Duyệt theo chiều rộng (BFS) procedure BFS(G: đồ thị với các đỉnh v1, v2, …, vn) T := cây chỉ chứa một đỉnh ban đầu v1 L := danh sách rỗng dùng để chứa các đỉnh đã đi qua Đặt đỉnh v1 vào danh sách L while L không rỗng

remove đỉnh v1 từ L for mỗi đỉnh kề w với đỉnh v1 do

if

w không có trong L and không có trong T then

w vào L

add add w and cạnh {v1, w} vào T

17

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

Độ phức tạp không gian

• Tất cả các đỉnh tại mức đang xét sẽ được lưu cho đến khi các

đỉnh kề được đi qua.

• Độ phức tạp không gian tỉ lệ thuận với số đỉnh ở mức sâu nhất

của đồ thị.

• Cho đồ thị có b là số đỉnh kề của mỗi đỉnh và chiều sâu d. Độ

phức tạp không gian là số đỉnh ở mức sâu nhất O(bd).

18

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 1. DUYỆT THEO CHIỀU RỘNG

Độ phức tạp thời gian

Trường hợp xấu nhất, BFS phải duyệt tất cả đường đi tới các đỉnh. Độ phức tạp thời gian xấp xỉ O(bd)

Tính đầy đủ

BFS có tính đầy đủ vì nó sẽ tìm tất cả các đỉnh không phân biệt loại đồ thị (vô hướng, có hướng, có trọng số…).

19

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Duyệt theo chiều sâu (Depth-First Search) đồ thị vô hướng.

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

C A B

D E

20

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Duyệt theo chiều sâu (Depth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A

B2: Đi qua đỉnh B

A B

21

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Duyệt theo chiều sâu (Depth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A

B2: Đi qua đỉnh B

A B C

B3: Đi qua đỉnh C

22

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Duyệt theo chiều sâu (Depth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A

B2: Đi qua đỉnh B

A C B

B3: Đi qua đỉnh C

E

B4: Đi qua E

23

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Duyệt theo chiều sâu (Depth-First Search) đồ thị vô hướng.

B1: Xuất phát từ đỉnh A

B2: Đi qua đỉnh B

A B C

B3: Đi qua đỉnh C

D E

B4: Đi qua E

B5: Đi qua D

24

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

THUẬT TOÁN : Duyệt theo chiều sâu (DFS) procedure DFS(G: đồ thị với các đỉnh v1, v2, …, vn)

T := cây chứa một đỉnh ban đầu v1 visit(v1)

procedure visit(v: đỉnh của G) for mỗi đỉnh w kề v và không trong T do add đỉnh w và cạnh {v, w} vào T visit(w)

25

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN DUYỆT ĐỒ THỊ 2. DUYỆT THEO CHIỀU SÂU

Độ phức tạp không gian

Độ phức tạp không gian của DFS thấp hơn BFS

Độ phức tạp thời gian

Tỉ lệ thuận với số đỉnh và số cạnh trong đồ thị đã được duyệt. Độ phức tạp thời gian là O(|V| + |E|).

Tính đầy đủ

DFS có tính đầy đủ vì nó sẽ tìm tất cả các đỉnh không phân biệt loại đồ thị (vô hướng, có hướng, có trọng số…).

26

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 1. CÂY KHUNG TỐI THIỂU

Giới thiệu cây khung tối thiểu

• Cây khung của đồ thị G là cây kết nối tất cả các đỉnh.

• Cây khung tối thiểu là cây có tổng trọng số của các cạnh nhỏ nhất.

3

3

3

A

B

A

B

A

B

5

7

7

6

4

4

C

D

C

D

C

D

2

2

2

Tổng chi phí = 12

Tổng chi phí = 9

27

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 2. THUẬT TOÁN PRIM

3

A

B

B1: Xuất phát đỉnh T: {A}

5

7

6

4

C

D

2

28

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 2. THUẬT TOÁN PRIM

3

A

B

B1: Xuất phát đỉnh T:= {A}

B2: chọn đỉnh B vì có trọng số nhỏ

7

4

trong những đỉnh kề với A

C

D

29

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 2. THUẬT TOÁN PRIM

3

A

B

B1: Xuất phát đỉnh T:= {A}

5

B2: chọn đỉnh B vì có trọng số nhỏ

7

6

4

trong những đỉnh kề với A

C

D

B3: Từ tập {A, B} xét các đỉnh kề

Với chúng {C, D}, chọn đỉnh C

30

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 2. THUẬT TOÁN PRIM

3

A

B

B1: Xuất phát đỉnh T: = {A}

7

B2: chọn đỉnh B vì có trọng số nhỏ

6

4

trong những đỉnh kề với A

C

D

2

B3: Từ tập {A, B} xét các đỉnh kề

Với chúng {C, D}, chọn đỉnh C

B4: Chọn D

31

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 2. THUẬT TOÁN PRIM

GIẢI THUẬT : PRIM procedure Prim(G: đồ thị gồm các đỉnh v1, v2, …, vn) T := {v1} for i := 0 to n – 2 do

e := chọn cạnh có trọng số nhỏ nhất nối tới

đỉnh trong T và không tạo chu trình trong T

T := T U e

return T

32

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 3. THUẬT TOÁN KRUSKAL

3

A

B

B1: Chọn cạnh có trọng số nhỏ nhất CD = 2 và thêm vào T := {(C, D)}

5

7

6

4

C

D

2

33

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 3. THUẬT TOÁN KRUSKAL

3

A

B

B1 : Chọn cạnh có trọng số nhỏ nhất

5

CD = 2 và thêm vào T := {(C, D)}

7

6

4

B2 : Chọn cạnh có trọng số nhỏ nhất

C

D

AB = 3 và thêm vào T := {(C,D), (A,B)}

2

34

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 3. THUẬT TOÁN KRUSKAL

3

A

B

B1 : Chọn cạnh có trọng số nhỏ nhất

5

CD = 2 và thêm vào T := {(C, D)}

7

6

4

B2 : Chọn cạnh có trọng số nhỏ nhất

C

D

AB = 3 và thêm vào T := {(C,D), (A,B)}

2

B3 : Chọn cạnh có trọng số nhỏ nhất

AC = 4

Dừng vì cây liên thông và qua tất cả

các đỉnh

35

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 3. THUẬT TOÁN KRUSKAL

THUẬT TOÁN : KRUSKAL procedure Kruskal(G: đồ thị gồm các đỉnh v1, v2, …, vn) T := ∅ for i := 1 to n – 1 do

e := chọn bất kỳ cạnh trong G có trọng số nhỏ

nhất nhưng không tạo chu trình trong T

T := T U e

return T

36

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

• Tìm đường đi ngắn nhất giữa 2 đỉnh trong một đồ thị

• Chỉ thực hiện trên trọng số dương

• Áp dụng cho đồ thị vô hướng và có hướng

37

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

b

Tìm đường ngắn nhất

2

c 3

từ đỉnh a đến đỉnh d

4

3 a d

1 2

e 3 f

38

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Khởi động

∞ b

∞ c

d(a) = 0

2

3

4

d(b) = ∞

3 a 0 d

d(f) = ∞

1

d(c) = ∞

2

3

d(e) = ∞

d(d) = ∞

e ∞ f ∞

39

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Bắt đầu đỉnh a

4(𝑎) b

∞ c

3

d(a) = 0

2

4

3 a 0

d(b) = min(d(b), d a + w a, b ) = min(∞, 0 + 4) = 4

d ∞

d(f) = min d f , d a + w a, f = min ∞, 0 + 2 = 2

1 2

3

e ∞ f 2 (a)

d(c) = ∞

d(e) = ∞

d(d) = ∞

40

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Vì d(f) < d(b) , bắt đầu đỉnh f

4(𝑎) b

∞ c

3

d(a) = 0 (đã đi qua)

2

4

d(b) = 4

3 a 0

d(f) = 2

d ∞

d(c) = ∞

1 2

3

d(e) = min d e , d f + w f, e = min(∞, 2 + 3) = 5

e ∞

f 2 (a)

d(d) = ∞

41

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Vì d(b) < d(e), bắt đầu đỉnh b

4(𝑎) b

∞ c

d(a) = 0 (đã đi qua)

2

3

d(b) = 4

4

d(f) = 2 (đã đi qua)

3 a 0

d ∞

d(c)= min d c , 𝑑 𝑏 + 𝑤 𝑏, 𝑐 = min ∞, 4 + 3 = 7

1 2

3

e 5 (f)

f 2 (a)

d(e) = min(5, d(b)+w(b, e)) = min(5, 4 + 3) = 5

d(d) = ∞

42

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Vì d(e) < d(c) , bắt đầu đỉnh e

4(𝑎) b

7 (b) c

3

d(a) = 0 (đã đi qua)

2

4

d(b) = 4 (đã đi qua)

3 a 0

d(f) = 2 (đã đi qua)

d ∞

d(c) = 7

1 2

d(e) = 5

3

e 5 (f)

d(d) = min ∞, 𝑑 𝑒 + 𝑤 𝑒, 𝑑 = min ∞, 5 + 1 = 6

f 2 (a)

43

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Vì d(d) < d(c), bắt đầu đỉnh d

4(𝑎) b

7 (b) c

3

d(a) = 0 (đã đi qua)

2

4

d(b) = 4 (đã đi qua)

3 a 0

d 6, (𝑒)

d(f) = 2 (đã đi qua)

d(c) = min(7, d(d) + w(d, c))= min(7, 6 + 2) = 7

1 2

3

e 5 (f)

d(e) = 5 (đã đi qua)

f 2 (a)

d(d) = 6

44

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

d(a) = 0 (đã đi qua)

4(𝑎) b

7 (b) c

3

d(b) = 4 (đã đi qua)

2

4

d(f) = 2 (đã đi qua)

3 a 0

d 6, (𝑒)

d(c) = 7

d(e) = 5 (đã đi qua)

1 2

d(d) = 6 (đã đi qua)

3

e 5 (f)

Dừng

f 2 (a)

45

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

Ta có các đường đi ngắn nhất

4(𝑎) b

7 (b) c

2

3

a  b = 4

4

a  b  c = 7

3 a 0

d 6, (𝑒)

a  f = 2

1 2

a  f  e  d = 6

3

e 5 (f)

a  f  e = 5

f 2 (a)

46

KHOA CÔNG NGHỆ THÔNG TIN

THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT 4. THUẬT TOÁN DIJKSTRA

THUẬT TOÁN DIJKSTRA procedure DIJKSTRA (G, w, s, d) d(s) := 0, T := V for mỗi v thuộc V do d(v) := ∞ while T ≠ ∅ do

Tìm u thuộc T sao cho d(u) nhỏ nhất T := T \ {u} for v thuộc tập đỉnh kề v do

d(v) := min(d(v), d(u) + w(u, v))

return d(v)

47

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP

1. Dùng DFS và BFS duyệt các đỉnh của đồ thị sau. Trình bày

từng bước

G

A

B

E

F

C

D

H

48

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP

2. Dùng Prim, Kruskal và Dijkstra cho đồ thị sau. Trình bày từng bước cụ thể.

G

2

2

2

A

B

3

2

3

3

E

F

6

2

C

D

4

4

5

3

1

H

49

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP

3. Cho ma trận sau

A

B

C

D

E

F

0

2

3

0

0

0

A

a) Vẽ đồ thị

2

0

0

5

2

0

B

b) Dùng DFS, BFS

3

0

0

0

5

0

C

c) Dùng Prim, Kruskal

0

5

0

0

1

2

D

d) Dùng Dijkstra từ đỉnh a đến f

0

2

5

1

0

4

E

0

0

0

2

4

0

F

50

KHOA CÔNG NGHỆ THÔNG TIN