Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
636,5 KB
Nội dung
Chuyên đề MỘT SỐ ỨNG DỤNG CỦA DFS Tác giả: Ngô Trung Tưởng –GV trường THPT Chuyên Lê Hông Phong-Nam Định Rất nhiều thuật toán đồ thị xây dựng dựa sở duyệt qua tất đỉnh đồ thị cho đỉnh thăm lần Vì vậy, việc xây dựng thuật tốn cho phép duyệt cách có hệ thống tất đỉnh đồ thị ứng dụng vấn đề quan trọng thu hút quan tâm nghiên cứu nhiều tác giả Những thuật toán gọi thuật toán tìm kiếm đồ thị Trong chun đề tơi giới thiệu số ứng dụng thuật toán tìm kiếm theo chiều sâu (DFS-Depth First Search) vào việc giải số toán đồ thị I Thứ tự duyệt đến duyệt xong: Thủ tục: DFS(u) - Khi bắt đầu vào thủ tục DFS(u) ta nói đỉnh u duyệt đến hay thăm (discover), tức thời điểm q trình tìm kiếm theo chiều sâu bắt đầu, từ u xây dựng nhánh DFS gốc u - Khi chuẩn bị thoát khỏi thủ tục DFS(u) để lùi về, ta nói đỉnh u duyệt xong (finish), tức thời điểm trình tìm kiếm theo chiều sâu kết thúc Trong thủ tục DFS ta thêm vào biến đếm Time để xác định thời điểm duyệt đến d[u] thời điểm duyệt xong f[u] - Mơ hình cài đặt thuật tốn DFS có thêm vào thứ tự duyệt đến duyệt xong Procedure DFS(u V) Begin Time:=Time+1; d[u]:=Time; output u; // thăm u for vV: (u,v) E //duyệt đỉnh nối từ v tới u // v chưa thăm gọi đệ qui tìm kiếm theo chiều sâu từ v If d[v]=0 then DSF(v) Time:=Time+1; f[u]:=Time; end; - Thứ tự duyệt đến duyệt xong có ý nghĩa quan trọng nhiều thuật tốn có sử dụng DFS, tìm thành phần liên thơng mạnh, tìm cầu, khớp đồ thị,… II Một số ứng dụng Tìm thành phần liên thơng mạnh đồ thị có hướng (thuật tốn Tarjan) a.Ý tưởng: Trong thuật toán Tarjan để liệt kê thành phần liên thơng mạnh đồ thị có hướng dựa thuật tốn tìm kiếm theo chiều sâu DFS - Cài đặt thuật toán dựa thứ tự duyệt đến + Number[u] thứ tự duyệt đến đỉnh u + Color[u] màu đỉnh u, Color[u] white (màu trắng) đỉnh u chưa thăm, Gray(màu xám) đỉnh u thăm chưa duyệt xong, Black (màu đen) đỉnh u bị xóa khỏi nhánh DFS + Low[u] giá trị Number[.] nhỏ đỉnh mà đến từ đỉnh v nhánh DFS gốc u cung Tính Low[u] sau: Khởi tạo Low[u]:=+∞, xét đỉnh v nối từ u có hai khả ++ Nếu v có màu Gray (xám): Low[u]:=min(Low[u],Number[v]) ++ Nếu v có màu White (trắng): Thăm V Low[u]:=min(Low[u],Low[v]) + Khi duyệt xong đỉnh u: so sánh Low[u] Number[u], Low[u] >= Number[u], u đỉnh thành phần liên thơng mạnh thuộc DFS gốc u, khơng có cung nối từ đỉnh DFS gốc u tới đỉnh thăm trước b Mơ hình cài đặt thuật toán Tarjan Procedure Tarjan(u); Begin Time:=Time+1; Number[u]:=Time; Low[u]:=+∞ Color[u]:=Gray; Push(u);//đẩy u vào stack For vV; (u,v)E If Color[v]=Gray then //đỉnh v thăm Begin Low[u]:=Min(Low[u],Number[v]); End Else If Color[v]=White then //đỉnh v chưa thăm Begin Tarjan(v); Low[u]:=Min(Low[u],Low[v]); End; If Low[u]>=Number[u] then //u chốt Begin //thông báo thành phần liên thơng Repeat v:=pop; Outputv Color[v]:=Black; //xóa đỉnh tplt vừa tìm Until v=u; End; End; BEGIN Time:=0; For i:=1 to n Number[i]:=0; For i:=1 to n If Number[i]=0 then Tarjan(i); END c Một số ví dụ: Bài Truyền tin (SPOJ) Một lớp gồm N học sinh, học sinh cho biết bạn mà học sinh liên lạc (chú ý liên lạc liên lạc chiều : u gửi tin tới v v chưa gửi tin tới u) Thầy chủ nhiệm có thơng tin quan trọng cần thông báo tới tất học sinh Để tiết kiệm thời gian, thầy nhắn tin tới số học sinh sau nhờ học sinh nhắn lại cho tất bạn mà học sinh liên lạc được, cho tất học sinh lớp nhận tin Hãy tìm số học sinh mà thầy chủ nhiệm cần nhắn Input - Dòng đầu N, M (N =number[u] then begin ans:=ans+1;//dem duoc phan lien thong manh repeat v:=s[top]; //lay dinh v khoi ngan xep top:=top-1; color[v]:=black; dd[v]:=ans; until u=v; end; end; procedure solve; var u,i:longint; begin time:=0; for u:=1 to n begin color[u]:=white; count[u]:=true; end; BEGIN end; ans:=0; for u:=1 to n if color[u]=white then begin top:=0; Tarjan(u); end; //danh dau dinh thi moi co cung di vao for i:=1 to m if dd[e[i].u]dd[e[i].v] then count[dd[e[i].v]]:=false; //dem so dinh thi moi khong co cung di vao res:=0; for i:=1 to ans if count[i] then res:=res+1; read_input; solve; write_output; END Biến đổi số (Mã bài: NUMBER) Cho M máy biến đổi số đánh số từ đến M số nguyên dương N Hoạt động máy i xác định cặp số nguyên dương (ai,bi) (11) then khop:=khop+1;//nếu nút cha có hai trở lên color[u]:=black; end; - Ví dụ: mã Graph_ tìm khớp cầu Spoj Xét đơn đồ thị vô hướng G = (V, E) có n(1