ความเข้าใจของฉันเกี่ยวกับปัญหาตามที่ระบุไว้เดิมและปรับปรุงแล้วโดยความคิดเห็นภายใต้คำตอบของ Macke รวมถึงต่อไปนี้: 1) ทั้งสองประเภทขอบ (อ้างอิงและความขัดแย้ง) ถูกนำ; 2) ถ้าสองโหนดเชื่อมต่อกันด้วยหนึ่งขอบพวกเขาจะต้องไม่เชื่อมต่อกันแม้ว่ามันจะเป็นประเภทอื่นหรือย้อนกลับ; 3) หากเส้นทางระหว่างสองโหนดสามารถสร้างขึ้นได้โดยการผสมขอบประเภทต่าง ๆ นั่นก็เป็นข้อผิดพลาดแทนที่จะเป็นกรณีที่ถูกเพิกเฉย 4) หากมีเส้นทางระหว่างสองโหนดที่ใช้ขอบของประเภทหนึ่งแสดงว่าอาจไม่มีเส้นทางอื่นระหว่างพวกเขาโดยใช้ขอบประเภทอื่น 5) ไม่อนุญาตให้ใช้รอบแบบขอบเดี่ยวหรือชนิดขอบแบบผสม (จากการเดาแอปพลิเคชันฉันไม่แน่ใจว่ารอบข้อขัดแย้งเท่านั้นเป็นข้อผิดพลาด แต่เงื่อนไขนี้สามารถลบได้หากไม่ได้)
นอกจากนี้ฉันจะสมมติว่าโครงสร้างข้อมูลที่ใช้ไม่ป้องกันการละเมิดข้อกำหนดเหล่านี้ที่จะแสดง (ตัวอย่างเช่นกราฟที่ละเมิดเงื่อนไขที่ 2 ไม่สามารถแสดงในแผนที่จากโหนดคู่ไปยัง (ประเภททิศทาง) หากโหนดคู่เสมอ มีโหนดที่มีหมายเลขน้อยที่สุดก่อน) หากไม่สามารถแสดงข้อผิดพลาดบางอย่างได้จะช่วยลดจำนวนกรณีที่ต้องพิจารณา
จริงๆแล้วมีสามกราฟที่สามารถนำมาพิจารณาได้ที่นี่: สองประเภทขอบเดียวและกราฟผสมที่เกิดจากการรวมกันของหนึ่งในสองประเภทนี้ คุณสามารถใช้สิ่งนี้เพื่อสร้างกราฟทั้งหมดถึงจำนวนโหนดอย่างเป็นระบบ ขั้นแรกสร้างกราฟที่เป็นไปได้ทั้งหมดของโหนด N ที่มีไม่เกินหนึ่งขอบระหว่างคู่ลำดับที่สั่งใด ๆ สองคู่ (คู่ที่สั่งซื้อเพราะเป็นกราฟโดยตรง) ตอนนี้รับกราฟคู่เหล่านี้ที่เป็นไปได้ทั้งหมดหนึ่งอันแสดงถึงการพึ่งพา จัดตั้งสหภาพของแต่ละคู่
หากโครงสร้างข้อมูลของคุณไม่สามารถแสดงการละเมิดเงื่อนไข 2 คุณสามารถลดจำนวนกรณีที่จะพิจารณาโดยการสร้างกราฟความขัดแย้งที่เป็นไปได้ทั้งหมดที่พอดีภายในพื้นที่ของกราฟการพึ่งพาหรือในทางกลับกัน มิฉะนั้นคุณสามารถตรวจจับการละเมิดเงื่อนไข 2 ขณะจัดตั้งสหภาพ
บนเส้นทางที่กว้างเป็นอันดับแรกของกราฟที่รวมกันจากโหนดแรกคุณสามารถสร้างชุดของเส้นทางทั้งหมดไปยังทุกโหนดที่เข้าถึงได้และในขณะที่คุณทำเช่นนั้นคุณสามารถตรวจสอบการละเมิดเงื่อนไขทั้งหมด (สำหรับการตรวจสอบวงจรคุณสามารถ ใช้อัลกอริทึมของ Tarjan )
คุณต้องพิจารณาเส้นทางจากโหนดแรกแม้ว่ากราฟจะถูกตัดการเชื่อมต่อเนื่องจากเส้นทางจากโหนดอื่นจะปรากฏเป็นเส้นทางจากโหนดแรกในบางกรณี
หากสามารถละเว้นพา ธ ขอบรวมแทนที่จะเป็นข้อผิดพลาด (เงื่อนไข 3) ก็เพียงพอที่จะพิจารณากราฟการพึ่งพาและความขัดแย้งได้อย่างอิสระและตรวจสอบว่าถ้าโหนดสามารถเข้าถึงได้ในโหนดใดโหนดหนึ่งจะไม่สามารถเข้าถึงได้
หากคุณจำเส้นทางที่พบในการตรวจสอบกราฟของโหนด N-1 คุณสามารถใช้พวกเขาเป็นจุดเริ่มต้นสำหรับการสร้างและประเมินกราฟของโหนด N
สิ่งนี้ไม่ได้สร้างขอบหลายประเภทที่เหมือนกันระหว่างโหนด แต่สามารถขยายได้เพื่อทำเช่นนั้น สิ่งนี้จะเพิ่มจำนวนคดีอย่างมากอย่างไรก็ตามจะเป็นการดีกว่าถ้ารหัสที่ถูกทดสอบทำให้สิ่งนี้เป็นไปไม่ได้ที่จะเป็นตัวแทนหรือความล้มเหลวนั้นจะกรองออกกรณีดังกล่าวทั้งหมดล่วงหน้า
กุญแจสำคัญในการเขียน oracle เช่นนี้คือการทำให้มันเรียบง่ายที่สุดเท่าที่จะเป็นไปได้แม้ว่านั่นจะหมายถึงการที่ไม่มีประสิทธิภาพดังนั้นคุณจึงสามารถสร้างความเชื่อมั่นในมันได้
เมื่อคุณมีวิธีในการสร้างกรณีทดสอบและคุณเชื่อว่า oracle ที่คุณสร้างขึ้นเพื่อแยกสิ่งที่ดีออกจากสิ่งที่ไม่ดีอย่างถูกต้องคุณอาจใช้สิ่งนี้เพื่อขับเคลื่อนการทดสอบอัตโนมัติของรหัสเป้าหมาย หากเป็นไปไม่ได้ตัวเลือกที่ดีที่สุดของคุณต่อไปคือการรวมผลลัพธ์สำหรับกรณีพิเศษ oracle สามารถจำแนกข้อผิดพลาดที่พบและให้ข้อมูลบางอย่างเกี่ยวกับกรณีที่ยอมรับเช่นจำนวนและความยาวของเส้นทางของแต่ละประเภทและมีโหนดใดบ้างที่เป็นจุดเริ่มต้นของเส้นทางทั้งสองประเภทและสิ่งนี้ สามารถช่วยคุณค้นหากรณีที่คุณไม่เคยเห็นมาก่อน