bồi dưỡng học sinh giỏi môn tin học thpt chuyên đề một số ỨNG DỤNG của DFS

12 685 1
bồi dưỡng học sinh giỏi môn tin học thpt chuyên đề một số ỨNG DỤNG của DFS

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chuyên đề MỘT SỐ ỨNG DỤNG CỦA DFS 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 toá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 chuyên đề 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 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 toá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 ∀v∈V: (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 toá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 toá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 toá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, 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 ∀v∈V; (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; Outputv 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 (a i,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

Ngày đăng: 29/04/2017, 19:47

Từ khóa liên quan

Mục lục

  • Input

  • Output

  • Example

  • Input

  • Output

  • Example

Tài liệu cùng người dùng

Tài liệu liên quan