Tải bản đầy đủ (.pdf) (31 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Lý thuyết đồ thị - TS. Trần Ngọc Việt

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 (2.37 MB, 31 trang )


L(b)= min{L(x)| x ∈ T} = 3
Suy ra: v = b và T:= T – {b} = {𝑐, 𝑑, 𝑒, 𝑧}
+ Thực hiện bước 3: Vì 𝑧 ≠ 𝑣, sang bước 4.
+Thực hiện bước 4:
Xét đỉnh d và đỉnh c kề đỉnh b. Ta có
L(c) := ∞ > L(b) + w(b,c) = 3 + 6 = 9 ⟹ L(c) := 9, gán P(c) := b;
L(d) := 4 : khơng đổi

(Hình 4)
KHOA CÔNG NGHỆ THÔNG TIN

22


4.2 Thuật toán đường đi ngắn nhất
+Thực hiện bước 2:
L(d)= min{L(x)| x ∈ T} = 4
Suy ra: v = d và T:= T – {d} = {𝑐, 𝑒, 𝑧}
+ Thực hiện bước 3: Vì 𝑧 ≠ 𝑣, sang bước 4.
+Thực hiện bước 4:
Xét đỉnh e và đỉnh c kề đỉnh d. Ta có
L(e) := ∞ > L(d) + w(d,e) = 4 + 4 = 8 ⟹ L(e) := 8, gán P(e) := d;
L(c) := 9 > L(d) + w(d,c) = 4 + 1 = 5 ⟹ L(c) := 5, gán P(c) := d;

(Hình 5)
KHOA CƠNG NGHỆ THƠNG TIN

23



4.2 Thuật toán đường đi ngắn nhất
+Thực hiện bước 2:
L(c)= min{L(x)| x ∈ T} = 5
Suy ra: v = c và T:= T – {c} = {𝑒, 𝑧}
+ Thực hiện bước 3: Vì 𝑧 ≠ 𝑣, sang bước 4.
+Thực hiện bước 4:
Xét đỉnh e và đỉnh z kề đỉnh c. Ta có
L(e) := 8 : khơng đổi;
L(z) := ∞ > L(c) + w(c,z) = 5 + 3 = 8 ⟹ L(z) := 8, gán P(z) := c;

(Hình 6)
KHOA CƠNG NGHỆ THÔNG TIN

24


4.2 Thuật toán đường đi ngắn nhất

+Thực hiện bước 2:
L(z)= min{L(x)| x ∈ T} = 8
Suy ra: v = z và T:= T – {z}
+ Thực hiện bước 3: Vì 𝑧 = 𝑣, kết thúc.
L(z) = 8 là độ dài đường đi ngắn nhất từ a đến z.
Vậy đường đi ngắn nhất là: a →d →c →z.

KHOA CÔNG NGHỆ THÔNG TIN

25



#BÀI TẬP 1:
a) Viết ma trận kề từ đồ thị có hướng như sau

(Hình 1)
b) Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị có hướng
như sau

(Hình 2)
KHOA CƠNG NGHỆ THƠNG TIN

26


BÀI KIỂM
#BÀI
TẬPTRA
2: số 5
Áp dụng thuật tốn Dijkstra’s tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị vô hướng sau
a)Viết ma trận kề từ đồ thị vơ hướng hình 1
đây
b)Tìm
đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị vơ
hướng hình 1

(Hình 1)

KHOA CÔNG NGHỆ THÔNG TIN

27



#Thực hành 01:

#Nhận xét: input, output ??
KHOA CÔNG NGHỆ THÔNG TIN

>>> import math
>>> import sys
>>> class Graph():
def __init__(cung, dinh):
cung.x = dinh
cung.graph = [[0 for column in range(dinh)]
for row in range(dinh)]
def inketqua(cung, L, a):
print ("đỉnh nguồn xuất phát từ: ")
for nut in range(cung.x):
print (a," đến đỉnh ",nut, "độ dài đường đi là: ", L[nut])
def duongdinhonhat(cung, L, P):
min = sys.maxsize
for x in range(cung.x):
if L[x] < min and P[x] == False:
min = L[x]
min_index = x
return min_index
def timduongdi(cung, a):
L = [sys.maxsize] * cung.x
L[a] = 0
P = [False] * cung.x
for cout in range(cung.x):
u = cung.duongdinhonhat(L, P)

P[u] = True
for x in range(cung.x):
if cung.graph[u][x] > 0 and P[x] == False and L[x] > L[u]
+ cung.graph[u][x]:
L[x] = L[u] + cung.graph[u][x]
cung.inketqua(L, a)
>>> g = Graph(6)
#đồ thị vô hướng
>>> g.graph = [[0, 3, 0, 1, 0, 0],
[3, 0, 5, 2, 0, 0],
[0, 5, 0, 0, 4, 2],
[1, 2, 0, 0, 6, 0],
[0, 0, 4, 6, 0, 7],
[0, 0, 2, 0, 7, 0]
];
>>> g.timduongdi(0);

28


#Thực hành 02:
>>> g = Graph(6)
#đồ thị có hướng
>>> g.graph = [[0, 3, 0, 4, 0, 0],
[0, 0, 6, 2, 0, 0],
[0, 0, 0, 0, 4, 3],
[0, 0, 1, 0, 4, 0],
[0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0]
];

>>> g.timduongdi(0);
#Nhận xét: input, output của thuật toán đường đi ngắn nhất
#Yêu cầu – comment vào dấu note, bước lặp, vịng lặp của giải thuật

KHOA CƠNG NGHỆ THƠNG TIN

29


#Thực hành 03:

a)Viết ma trận kề từ đồ thị có hướng (hình 1)
a) Viết ma trận kề từ đồ thị có hướng
b)Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z (đỉnh 0 đến đỉnh 5)
b) Tìm đường đi ngắn nhất từ đỉnh a đến đỉnh z trong đồ thị có hướng.
trong đồ thị có hướng (hình 1)

(Hình 1)

KHOA CÔNG NGHỆ THÔNG TIN

30




×