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

Đường đi trong đồ thị không có chu trình

Một phần của tài liệu ỨNG DỤNG NGÔN NGỮ SQL TRONG TÍNH TOÁN KHOA HỌC VÀ GIẢNG DẠY (Trang 67 -71 )

Bước lặp Đỉnh 1 Đỉnh 2 Đỉnh 3 Đỉnh 4 Đỉnh 5 Đỉnh 6 Khởi tạo 1,0 1, 1* 1, 1, 1, 1, 1 - - 2, 6 2, 3 * 1, 2, 8 2 - - 4, 4 * - 4, 7 2, 8 3 - - - - 4, 7 3, 5* 4 - - - - 6, 6 * - 5

59

Bây giờ ta xét trường hợp riêng thứ hai của bài toán tìm đường đi ngắn nhất, mà để giải nó có thể xây dựng thuật toán với độ phức tạp tính toán O(n2), đó là đồ thị không có chu trình (còn trọng số trên các cung có thể là các số thực tuỳ ý). Trước hết ta chứng minh định lý sau:

Định lý 2. Giả sử G là đồ thị không có chu trình. Khi đó các đỉnh của nó có

thể đánh số sao cho mỗi cung của đồ thị chỉ hướng từ đỉnh có chỉ số nhỏ hơn đến đỉnh có chỉ số lớn hơn, nghĩa là mỗi cung của nó có thể biểu diễn dưới dạng (v[i],v[j]), trong đó i<j .

Ví dụ 1. Đồ thị trong hình sau có các đỉnh được đánh số thỏa mãn điều kiện nêu trong định lý. 7 (3) 8 (5) t = 9 (1) (1) (2) 4 (5) 5 (4) s = 1 6 (10) (1) (7) (5) 2 (2) 3 Hình 3.10. Đồ thị không có chu trình

Để chứng minh định lý ta mô tả thuật toán sau, cho phép tìm ra cách đánh số thỏa mãn điều kiện định lý.

Procedure Numbering;

(*Đầu vào: Đồ thị có hướng G=(V,E) với n đỉnh không chứa chu trình được cho bởi danh sách kề Ke(v),v V.

Đầu ra: Với mỗi đỉnh v V chỉ số NR[u] < NR[v]. *) begin

60 for v V do vao[v]:=0;

(* tinh vao[v]=deg-(v) *) for uV do

for vKe(u) do vao[v]:=vao[v] + 1; QUEUE:=∅;

for v V do

if Vao[v]=0 then QUEUE ⇐ v ; num :=0;

while QUEUE ≠ ∅ do begin u QUEUE;

num :=num +1; NR[u] :=num; for vKe(u) do

begin

vao[v]:=Vao[v] - 1;

if vao[v]=0 then QUEUE v ; end;

end; end;

Thuật toán được xây dựng dựa trên ý tưởng rất đơn giản sau: Rõ ràng trong đồ thị không có chu trình bao giờ cũng tìm được đỉnh có bán bậc vào bằng 0 (không có cung đi vào). Thật vậy, bắt đầu từ đỉnh v1 nếu có cung đi vào nó từ v2 thì ta lại chuyển sang xét đỉnh v2. Nếu có cung v3 đi vào v2, thì ta chuyển sang xét v3, ... Do đồ thị là không có chu trình nên sau một số hữu hạn lần chuyển như vậy ta phải đi đến đỉnh không có cung đi vào. Thoạt tiên, tìm các đỉnh như vậy của đồ thị. Rõ ràng

61

ta có thể đánh số chúng theo một thứ tự tùy ý bắt đầu từ 1. Tiếp theo, loại bỏ khỏi đồ thị những đỉnh đã được đánh số cùng các cung đi ra khỏi chúng, ta thu được đồ thị mới cũng không có chu trình và thủ tục được lặp lại với đồ thị mới này. Quá trình đó sẽđược tiếp tục cho đến khi tất cảcác đỉnh của đồ thị được đánh số.

Lưu ý:

• Rõ ràng trong bước khởi tạo ta phải duyệt qua tất cả các cung của đồ thị khi tính bán bậc vào của các đỉnh, vì vậy ở đó ta tốn cỡ O(m) phép toán, trong đó m là số cung của đồ thị. Tiếp theo mỗi lần đánh số một đỉnh, để thực hiện việc loại bỏ đỉnh đã được đánh số cùng với các cung đi ra khỏi nó, chúng ta sẽ phải duyệt qua tất cả các cung này. Vì vậy, để đánh số tất cả các đỉnh của đồ thị chúng ta sẽ phải duyệt tất cả các cung của đồ thị một lần nữa. Cho nên độ phức tạp thuật toán là O(m).

• Thuật toán có thểđể kiểm tra xem đồ thị có chứa chu trình hay không?.

Thật vậy, nếu kết thúc thuật toán vẫn còn có đỉnh chưa được đánh số (num<n) thì điều đó có nghĩa là đồ thị chứa chu trình.

Do có thuật toán đánh số trên nên khi xét đồ thị không có chu trình ta có thể giả thiết là các đỉnh của nó được đánh số sao cho mỗi cung chỉ đi từ đỉnh có chỉ số nhỏ đến đỉnh có chỉ số lớn hơn. Thuật toán tìm đường đi ngắn nhất trên đồ thị không có chu trình được mô tảtrong sơ đồ sau đây:

Procedure Critical_Path;

(* Tìm đường đi ngắn nhất từ đỉnh nguồn đến tất cả các đỉnh còn lại trên đồ thị không có chu trình

Đầu vào: Đồ thị G=(V,E) trong đó V= { v[1], v[2], ..., v[n] } Đối với mỗi cung (v[i],v[j])E ta có i<j.

62

Đầu ra: Khoảng cách từ v[1] đến tất cả các đỉnh còn lại được ghi trong mảng d[v[i] ], i=1,2,...,n * ) Begin d[v[1] ]:=0; for j:=2 to n do d[v[j] ]:=a[v[1] ],v[j] ]; fo j:=2 to n do for vKe [v [j ] ] do d [v ]:=min ( d [v ], d [v [j ] ] + a [v [j ] ], v ); end;

Độ phức tạp của thuật toán là O(m) do mỗi cung của đồ thị phải xét qua đúng một lần.

Các thuật toán mô tả ở trên thường được ứng dụng vào việc xây dựng những phương pháp giải bài toán điều khiển việc thực hiện những dự án lớn, gọi tắt là PERT (Project Evaluation and Review Technique ) hay CMD (Critical path method)

Một phần của tài liệu ỨNG DỤNG NGÔN NGỮ SQL TRONG TÍNH TOÁN KHOA HỌC VÀ GIẢNG DẠY (Trang 67 -71 )

×