Tìm chu trình Euler trong ựồ thị G
Cài ựặt chương trình tìm chu trình Euler trong ựồ thị G.
Cho ựồ thị G=(X,E) tồn tại chu trình Euler. Hãy tìm chu trình (chi trình Euler là chu trình ựi qua tất cả các cạnh của ựồ thị, mỗi cạnh ựi qua ựúng một lần).
Phân tắch bài toán : đầu vào: đồ thị G
đầu ra: Chu trình Euler (nếu có) 2. Thuật toán:
Xuất phát từ một ựỉnh u bất kỳ, khi ựi qua cạnh nào thì xoá cạnh ựó khỏi ựồ thị và ghi lại từ trái sang phải. Khi thực hiện thuật toán cần lưu ý nếu gặp cạnh bắc cầu giữa 2 thành phần liên thông thì ta phải xoá hết thành phần liên thông rồi mới xoá ựến cạnh bắc cầu. Khi xoá cạnh bắc cầu thì phải loại hết các ựỉnh trơ trọi (nghĩa là không kề với bất cứ ựỉnh nào thuộc ựồ thị).
Cấu trúc dữ liệu:
Biểu diễn ựồ thị bằng ma trận kề a(i,j), do ựó lưu ý khi xoá ựi một cạnh ta chỉ việc gán a(i,j)=a(j,i)=0, ựồng thời phải lưu cạnh vừa xoá vào một mảng khác: Mảng Ctr.
Mảng lt: array [1ẦNmax] of integer dùng trong thủ tục tìm thành phần liên thông (giống như một thuật toán tìm thành phần liên thông trình bày ở trên).
Mảng dd: array [1ẦNmax] of Boolean, giá trị dd[i] cho biết ựỉnh i bị loại khỏi ựồ thị hay chưa. Nếu bị lại thì dd[i]=True; ngược lại dd[i]=False;
Thủ tục
Procedure Euler_Cycle; Begin
STACK:=∅ ; CE:=∅ ;
Chon u la mot dinh nao do cua do thi; STACK← u;
While STACK<>∅ do Begin
X:=top(STACK); (* x la phan tu dau STACK) If Ke(x)<>∅ then
Begin
Y:=dinh dau tien trong danh sach Ke(x); STACK← y;
(* loai bo canh (x,y) khoi do thi *) Ke(x):=Ke(x)\ { y} ; Ke(y):=Ke(y)\{ x} ; End Else Begin x⇐ STACK; CE⇐ x; End; End;
End;