หากคุณทำเมทริกซ์ 26X26 เพื่อแสดงกราฟกำกับของจุดยอดเป็นตัวอักษรและคำแต่ละคำเป็นขอบ ตัวอย่างเช่นคำ - แอปเปิ้ลเชื่อมต่อจุดยอด A และ E โดยมีขอบกำกับจาก A ถึง E ตอนนี้ปัญหาลดลงเพื่อหาเส้นทาง Eulerian ที่ใหญ่ที่สุด (เส้นทางที่มีจำนวนสูงสุดของขอบโดยไปที่ขอบแต่ละครั้ง หนึ่งในอัลกอริทึม O (E) จะเริ่มสุ่มจากคู่ของจุดยอด ค้นหาเส้นทางระหว่างพวกเขา กว่าที่จะผ่อนคลายเส้นทางจนกว่ามันจะเป็นไปได้
update
@ GlenH7 ฉันแก้ไขคำถามที่คล้ายกันใน www.hackerearth / jda เมื่อเร็ว ๆ นี้มีเครื่องหมายสัมพัทธ์ที่เกี่ยวข้องกับวิธีการแก้ปัญหาที่ดีที่สุดและฉันได้คะแนนสูงสุดด้วยการอนุมัติต่อไปนี้ -
รับรายการคำศัพท์ ค้นหาห่วงโซ่ที่ยาวที่สุดที่สามารถเกิดขึ้นได้โดยพวกเขา ห่วงโซ่ใช้ได้ถ้าทุกคำเริ่มต้นด้วยตัวอักษร * สิ้นสุดที่ท้ายคำสุดท้าย
Approch =
1) สร้างกราฟของตัวอักษรเป็นจุดยอดและคำเป็นขอบ แทนที่การใช้ขอบหลายอันให้ใช้อันที่มีน้ำหนักเท่ากับจำนวนขอบ
2) ค้นหาองค์ประกอบที่เชื่อมต่ออย่างยิ่งของกราฟที่มีขอบสูงสุด ยกเลิกขอบอื่นชั่วคราว
3) สำหรับจุดสุดยอดแต่ละอันทำให้มันมีค่าเท่ากับจำนวนของมัน
4) ตอนนี้วงจรออยเลอร์มีอยู่ในกราฟ หามัน
5) ตอนนี้ในกราฟที่เหลืออยู่ (กราฟ wrt orignal ค้นหาเส้นทางที่ยาวที่สุดที่มีจุดยอดแรกในองค์ประกอบที่เชื่อมต่ออย่างมากที่เลือกฉันคิดว่านี่เป็นปัญหาที่ยาก
6) รวมเส้นทางข้างต้นในวงจรเอเลเรียนที่จะแปลงวงจรอีริเรียนไปเป็นเส้นทาง
ทำไม - ฉันยอมรับว่าคำถามนี้น่าจะเป็นปัญหาที่ยากที่สุด (เดาไม่ได้พูดทางคณิตศาสตร์) แต่วิธีการข้างต้นทำงานได้ดีที่สุดเมื่อมีรายการยาว (1,000+) ของคำที่กระจายอย่างสม่ำเสมอ (เช่นไม่ได้ตั้งใจที่จะเป็น wc สำหรับวิธีการข้างต้น) ขอให้เราสมมติว่าหลังจากแปลงรายการที่ระบุเป็นกราฟที่กล่าวถึงข้างต้นแล้วโชคดีที่กลายเป็นกราฟ eulerian (ดูที่http://en.wikipedia.org/wiki/Eulerian_pathสำหรับเงื่อนไข) จากนั้นไม่ต้องสงสัยเลยว่าเราสามารถพูดคำตอบนั้นได้ คำถามข้างต้นคือ P และเป็นเส้นทางของ eulerian ในกราฟ (ดูhttp://www.graph-magics.com/articles/euler.phpเพื่อดูการอนุมัติที่ง่ายมากและดูสิ่งนี้เพื่อยืนยันว่ากราฟของคุณมีhttp://www.geeksforgeeks.orgเดียวและหากไม่ได้ทำความสะอาด scc ขนาดเล็กอื่นชั่วคราวเนื่องจากมีเส้นทางของ eulerian สำหรับ scc เดียว) ดังนั้นสำหรับกรณีที่ไม่ได้โชคดี (ซึ่งเกือบทุกกรณี) ฉันพยายามที่จะแปลงเป็นกรณีที่โชคดี (เช่นเงื่อนไขเส้นทาง eulerian เป็นจริง) ทำอย่างไร ฉันพยายามเพิ่มการค้นหาเชิงลึกเพื่อหาขอบที่ไม่เกี่ยวข้อง (ชุดของขอบในเส้นทางที่จ้องมองจากจุดสุดยอดที่มีค่าเริ่มต้นมากกว่าผู้เริ่มต้นและสิ้นสุดที่จุดสุดยอดด้วยการตั้งค่าที่ไม่ใหญ่กว่า) การเพิ่มการค้นหาเชิงลึกนั้นหมายถึงตอนแรกที่ฉันค้นหาชุดของขอบหนึ่งในเส้นทางทั้งหมดกว่าสองขอบในเส้นทางและอื่น ๆ มันอาจดูเป็นครั้งแรกที่การค้นหาเชิงลึกซึ่งจะใช้ O (โหนด ^ i) ดังนั้นความซับซ้อนของเวลาทั้งหมดของ O (โหนด + โหนด ^ 2 + โหนด ^ 3 + .... ) จนกระทั่งมันเป็นกรณีที่โชคดี แต่การวิเคราะห์ค่าตัดจำหน่ายจะมีความสุขมากมันเป็น O (ขอบ) เมื่อมันถูกลดขนาดผู้โชคดีพบวงจร eulerian
จนกระทั่งถึงที่นี่เป็นเวลาพหุนามทั้งหมด นี่จะให้ทางออกที่ดีที่สุดเกือบ แต่เพื่อเพิ่มโซลูชันของคุณเพิ่มเติม (โซลูชันที่สมบูรณ์แบบคือปัญหา NP ยาก) ลองใช้วิธีโลภในกราฟที่เหลือเพื่อค้นหารอยทางยาวที่มองด้วยหนึ่งในจุดยอดที่เลือก ทีนี้เพิ่มสิ่งนี้ลงใน eulerian trail ที่พบเพื่อเพิ่ม