วัตถุประสงค์ของโหนดสีเทาในการค้นหากราฟครั้งแรก


19

ในการนำไปใช้งานหลายครั้งของการค้นหาความลึกครั้งแรกที่ฉันเห็น (ตัวอย่าง: ที่นี่ ) รหัสแยกความแตกต่างระหว่างจุดสุดยอดสีเทา (ค้นพบ แต่ไม่ใช่การเยี่ยมเพื่อนบ้านทั้งหมด) และจุดสุดยอดสีดำ (ค้นพบและเพื่อนบ้านทั้งหมด) . จุดประสงค์ของความแตกต่างนี้คืออะไร? ดูเหมือนว่าอัลกอริทึม DFS จะไม่เข้าเยี่ยมชมจุดสุดยอดไม่ว่าจะเป็นสีเทาหรือสีดำ

คำตอบ:


26

เมื่อทำการ DFS โหนดใด ๆ จะอยู่ในสถานะใดสถานะหนึ่งในสามสถานะก่อนที่จะถูกเยี่ยมชมในระหว่างการเยี่ยมชมลูกหลานซ้ำและหลังจากลูกหลานทั้งหมดของมันได้รับการเยี่ยมชม (กลับไปที่แม่ของมันคือช่วงปิดล้อม) สามสีนั้นสอดคล้องกับแต่ละสถานะของทั้งสาม หนึ่งในเหตุผลที่กล่าวถึงสีและเวลาในการเยี่ยมชมและกลับมาคือการสร้างความแตกต่างเหล่านี้อย่างชัดเจนเพื่อความเข้าใจที่ดีขึ้น

แน่นอนว่ามีการใช้สีเหล่านี้อย่างแท้จริง พิจารณากำกับกราฟGสมมติว่าคุณต้องการตรวจสอบว่ามีวัฏจักรอยู่หรือไม่ ในกราฟที่ไม่ได้บอกทิศทางหากโหนดที่อยู่ในการพิจารณามีเพื่อนบ้านที่เป็นสีดำหรือสีเทามันจะบ่งบอกถึงวัฏจักร (และ DFS ไม่ได้เยี่ยมชมดังที่คุณกล่าวถึง) อย่างไรก็ตามในกรณีของกราฟกำกับเพื่อนบ้านสีดำไม่ได้หมายถึงรอบ ตัวอย่างเช่นพิจารณากราฟที่มี 3 จุด - การและมีขอบกำกับเป็น , ,C สมมติว่าเริ่ม DFS ที่แล้วผู้เข้าชมแล้วCเมื่อมันได้กลับไปG A , B , C A B B C A C A B C A CGGA,B,CABBCACABCAจากนั้นจะตรวจสอบว่าได้เข้าชมแล้วและเป็นสีดำ แต่ไม่มีวงจรในกราฟC

ในกราฟที่กำกับรอบจะมีอยู่หากว่าโหนดนั้นถูกมองเห็นอีกครั้งก่อนที่ลูกหลานของมันจะถูกเยี่ยมชม กล่าวอีกนัยหนึ่งถ้าโหนดมีเพื่อนบ้านซึ่งเป็นสีเทาแล้วมีวงจร (และไม่เมื่อเพื่อนบ้านเป็นสีดำ) โหนดสีเทาหมายความว่าขณะนี้เรากำลังสำรวจลูกหลานของมัน - และหากลูกหลานหนึ่งนั้นมีขอบของโหนดสีเทานี้แสดงว่ามีวงจร ดังนั้นสำหรับการตรวจสอบวงจรในกราฟกำกับคุณต้องมี 3 สี อาจมีตัวอย่างอื่นด้วย แต่คุณควรเข้าใจ


2
+1 คำอธิบายที่ดี สำหรับการข้ามผ่านอย่างง่ายของโหนดทั้งหมดในกราฟที่ไม่มีทิศทาง (เช่นเดียวกับที่เชื่อมโยงในส่วนคำถามของฉัน) GRAY และ BLACK จะไม่มีความแตกต่างในการทำงานหรือไม่?
user6805

1
@ user6805 สำหรับการสำรวจเส้นทางแบบง่าย - ไปที่ทุกโหนด - ของกราฟที่กำหนดทิศทางหรือไม่ระบุทิศทางไม่มีความแตกต่างในการทำงานระหว่างสีเทาและสีดำ คุณสามารถใช้สองสีเท่านั้น (หรือเยี่ยมชม / ไม่ได้เยี่ยมชม) มันเป็นอัลกอริทึมที่ซับซ้อนมากขึ้นที่คุณต้องการสี
Paresh

ฉันเข้าใจแล้ว! ตกลงพิจารณากรณีต่อไปนี้: twitter.com/MaksimADmitriev/status/796995958043279361เราสำรวจกราฟโดยใช้ DFS กราฟทางด้านซ้ายเหมือนกับกราฟจากคำตอบนี้และไม่มีรอบ ลองสำรวจกราฟทางด้านขวาซึ่งมีวงจร เราไปที่ A และทำเครื่องหมายว่าเป็นสีเทา เราไปที่ B และทำเครื่องหมายสีเทา เราไปที่ C และทำเครื่องหมายว่าเป็นสีเทา ตอนนี้เรากำลังจะไป A ซึ่งเป็นสีเทาอยู่แล้ว ดังนั้น "จากสีดำเป็นสีดำ" ไม่ได้หมายความว่ามีรอบ แต่ "จากสีเทาเป็นสีเทา" นั่นเป็นเหตุผลที่เราต้องการสีเทา โปรดแก้ไขให้ฉันด้วยถ้าฉันผิด
Maksim Dmitriev

เพื่อวัตถุประสงค์ที่ซับซ้อนยิ่งขึ้นเช่นการค้นหาส่วนประกอบที่เชื่อมต่ออย่างแรงเราอาจต้องบันทึกสองครั้งสำหรับแต่ละโหนด: ก่อนเวลาเมื่อพบโหนดแรก (เช่นเวลาที่เป็นสีเทา) และเวลาหลังเมื่อเสร็จสิ้นการเยี่ยมชมโหนด (เช่นเวลาที่เป็นสีดำ) เมื่อต้องการใช้การบันทึกตัวนับจะถูกรักษาไว้ซึ่งจะเพิ่มขึ้นเมื่อแต่ละเหตุการณ์เกิดขึ้น
จอห์น

2

มันเป็นแบบฝึกหัดใน CLRS ที่คุณสามารถลบสีเทาหรือสีดำและอัลกอริทึมทำงานได้ดีเพียงสองสีหรือพูดอีกอย่างก็คือมันไม่จำเป็นจริงๆ เป้าหมายหลักของการทำเครื่องหมายจุดยอดคือเพื่อให้แน่ใจว่าเราจะไม่วิ่งวนซ้ำไปเรื่อย ๆ โดยไปที่จุดยอดเยี่ยมที่เคยเยี่ยมชมแล้ว

เหตุผลในการใช้ 3 สีในอัลกอริทึม DFS นั้นส่วนใหญ่เป็นการสอน: มันเป็นแนวคิดที่ชัดเจนยิ่งขึ้นซึ่งจะช่วยให้นักเรียนเห็นสิ่งที่เกิดขึ้นในระหว่างการดำเนินการสำหรับแต่ละโหนด


0

จุดยอดสีเทาระบุว่าคุณเคยไปที่โหนดนั้นและย้ายไปยังหนึ่งในเพื่อนบ้านในบางลำดับ แต่อาจมีจุดยอดที่อยู่ใกล้เคียงกับโหนดนั้นมากกว่า มันจะมีประโยชน์ในขณะที่ backtracking สำหรับการสำรวจจุดยอดที่ไม่ได้เข้าชม

สมมติว่าจุดสุดยอดมีสองประเทศเพื่อนบ้าน B และ C และ B มีเพื่อนบ้าน D

เริ่มต้นที่จุดยอด A ซึ่งเป็นสีขาวและทำให้มันเป็นสีเทาและทราเวิร์สไปยังเพื่อนบ้าน

ให้พูดโดยเลือกลำดับตัวอักษรมันเข้าสู่จุดยอด Bซึ่งเป็นสีขาวและทำเครื่องหมายเป็นสีเทา

จากนั้นไปที่D of white -> grey D -> ไม่มีเพื่อนบ้านอีกแล้ว จึงเครื่องหมายD-> สีดำ

ตอนนี้ย้อนรอยกลับไปที่ B in Grey และไม่มีอีกต่อไป ดังนั้นเครื่องหมายB-> สีดำ

รับ backtracks A เป็นสีเทาและไปที่เครื่องหมาย c เพื่อ> c-> สีเทาไม่มีเพื่อนบ้านทำเครื่องหมาย C เป็นสีดำ

ในที่สุดกลับไปที่ A และทำเครื่องหมายจุดสุดยอด A เป็นสีดำเนื่องจากไม่มีจุดยอดสีขาวและสีดำทั้งหมด


ฉันไม่เห็น
ว่าความ

นั่นคือสิ่งที่คุณต้องเข้าใจ หากจุดสุดยอดถูกทำเครื่องหมายเป็นสีดำหมายความว่าไม่มีจุดยอดที่อยู่ใกล้เคียงกับจุดสุดยอดนั้น จุดยอด D ถูกทำเครื่องหมายเป็นสีดำเนื่องจากไม่มีจุดยอดเพื่อนบ้าน .. ซึ่งเป็นสีเทาแนะนำว่ามีเพื่อนบ้านให้เยี่ยมชมมากกว่าและคุณข้ามผ่านสิ่งเหล่านี้
NRK

ผมเชื่อว่ามันช่วยให้คุณประหยัดจากเพียงแค่อีกครั้งไปเยือนโหนดคุณรู้ว่าสำหรับบางมีขอบกลับไม่มี (เช่นการเพิ่มประสิทธิภาพ)
Setheron

0

ใน DFS เราจัดประเภทขอบเป็นขอบไปข้างหน้า, ขอบด้านหลัง, ข้ามขอบและขอบต้นไม้

เราใช้ 3 สีเพื่อจำแนกขอบ และสีเหล่านี้แสดงถึงสถานะของจุดยอดเช่นโวลต์สีขาว: ยังไม่พบจุดยอด v

grey: v ถูกค้นพบแล้ว แต่จุดยอดทั้งหมดที่เข้าถึงได้จาก v นั้นยังไม่ถูกค้นพบ ดังนั้นจุดยอด v ยังคงอยู่ในสแต็ก

black: v โผล่ออกมาจาก stack.discovered และเสร็จสิ้นแล้ว

ในการทำ DFS ถ้าคุณพบจุดสุดยอดสีเทาผ่าน edge e แล้วก็เป็น back back หากคุณพบจุดสุดยอดสีดำผ่านขอบ e นั่นก็คือ cross edge / edge edge ถ้าคุณพบจุดสุดยอดสีขาวแล้วคุณจะเรียก DFS ซ้ำ


ตกลง แต่ประเด็นคืออะไร คุณเคยบอกว่าสีขาว / เทา / ดำเกี่ยวข้องกับการส่งต่อ / ย้อนกลับ / ข้าม / ต้นไม้ แต่คุณไม่ได้บอกว่าสิ่งเหล่านั้นมีไว้เพื่ออะไร ดังนั้นตอนนี้มีเจ็ดสิ่งที่ผู้ถามไม่เข้าใจแทนที่จะเป็นแค่สามข้อ!
David Richerby

สามารถใช้ขอบเหล่านี้ในแอพพลิเคชั่นต่าง ๆ ของ DFS เช่นเดียวกับขอบด้านหลังที่ใช้ในการระบุลูปในกราฟส่วนหน้าและขอบครอสจะถูกใช้ในการทดสอบว่ามีเส้นทางที่ไม่ซ้ำกันอยู่หรือไม่
Neeraj Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.