ในการแวะผ่าน DFS โหนดจะเสร็จสิ้นเมื่อลูกทั้งหมดของพวกเขาเสร็จสิ้น หากคุณทำเครื่องหมายเวลาค้นหาและสิ้นสุดสำหรับแต่ละโหนดในระหว่างการแวะผ่านคุณสามารถตรวจสอบเพื่อดูว่าโหนดนั้นเป็นผู้สืบทอดหรือไม่โดยการเปรียบเทียบเวลาเริ่มต้นและสิ้นสุด ในความเป็นจริงการแวะผ่าน DFS ใด ๆ จะแบ่งขอบตามกฎต่อไปนี้
ให้ d [node] เป็นเวลาที่ค้นพบของ node เช่นเดียวกันให้ f [node] เป็นเวลาสิ้นสุด
ทฤษฎีบทวงเล็บสำหรับทุกท่าน, v, ถือหนึ่งในสิ่งต่อไปนี้:
1. d [u] <f [u] <d [v] <f [v] หรือ d [v] <f [v] <d [u ] <f [u] และไม่ใช่ทั้งคุณและ v เป็นผู้สืบทอดของอีกกลุ่ม
d [u] <d [v] <f [v] <f [u] และ v เป็นทายาทของ u
d [v] <d [u] <f [u] <f [v] และ u เป็นทายาทของ v
ดังนั้น d [u] <d [v] <f [u] <f [v] ไม่สามารถเกิดขึ้นได้
เช่นเดียวกับวงเล็บ: () [], ([]) และ [()] นั้นโอเค แต่ ([)] และ [(]) นั้นไม่โอเค
ตัวอย่างเช่นพิจารณากราฟที่มีขอบ:
A -> B
A -> C
B -> C
ให้ลำดับของการเยี่ยมชมถูกแสดงโดยสตริงของโหนดฉลากโดยที่ "ABCCBA" หมายถึง A -> B -> C (เสร็จสิ้น) B (เสร็จสิ้น) A (เสร็จสิ้น) A (เสร็จสิ้น) คล้ายกับ (())
ดังนั้น "ACCBBA" อาจเป็นแบบจำลองสำหรับ "(() ())"
ตัวอย่าง:
"CCABBA": จากนั้น A -> C เป็น cross edge เนื่องจาก CC ไม่ได้อยู่ภายใน A.
"ABCCBA": A -> C เป็นขอบไปข้างหน้า (ผู้สืบทอดทางอ้อม)
"ACCBBA": จากนั้น A -> C คือขอบต้นไม้ (สืบทอดโดยตรง)
แหล่งที่มา:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure Notes http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm