เขียนกติกาจนเป็นที่หนึ่ง

o62_may11_exam

ในข้อนี้เราจะแทนผู้เข้าแข่งขันแต่ละคนด้วยจุดยอดของกราฟ แล้วให้มีเส้นเชื่อมทางเดียวจากจุดยอด AA ไปหา BB ก็ต่อเมื่อ AA สามารถชนะ BB ด้วยข้อสอบข้อใดข้อหนึ่ง

สังเกตว่าสำหรับจุดยอด AA และ BB ใด ๆ หากมี path จาก AA ไปหา BB สรุปได้ว่าสามารถจัดการแข่งขันให้ AA เหลือเป็นคนสุดท้ายจากทุก ๆ ผู้เข้าแข่งขันที่อยู่บน path นี้

ดังนั้นถ้ามีจุดยอด uu ที่มี path ไปหาทุก ๆ จุดยอดบนกราฟนี้ เราสามารถจัดการแข่งขันให้ uu เป็นที่หนึ่งได้ ปัญหาของเราจึงกลายเป็นการหาจุดยอด uu เหล่านี้

ในการหาจุดยอด uu เหล่านี้ เราจะสร้าง condensation graph โดยใช้ Tarjan's algorithm หรือ Kosaraju's algorithm เพื่อหา strongly connected components ของกราฟนี้ โดยคำตอบคือจุดยอดทั้งหมดที่อยู่ใน strongly connected component ที่แทนโดยจุดยอดใน condensation graph ที่มี in-degree เท่ากับ 00

อุปสรรคในข้อนี้คือ จำนวน edge ที่จะต้องสร้างทั้งหมด ใน worst case แล้วจะต้องสร้างทั้งหมด O(n2k)\mathcal{O}(n^2k) เส้น ซึ่งมากเกินไป

วิธีแก้ปัญหานี้คือ เราจะเปลี่ยนโครงสร้างของกราฟ โดยมีจุดยอดเพิ่ม kk จุด เรียก v1,v2,...,vkv_1, v_2, ..., v_k แทนข้อสอบ kk ข้อ และให้มีเส้นเชื่อมจาก uu ไปหา viv_i ก็ต่อเมื่อ uu สามารถทำข้อสอบข้อที่ ii ได้ และมีเส้นเชื่อมจาก viv_i ไปหา uu ก็ต่อเมื่อ uu ไม่สามารถทำข้อสอบข้อที่ ii

ในโครงสร้างของกราฟแบบใหม่นั้น ข้อสังเกตของเราที่กล่าวไว้ข้างต้นยังคงเป็นจริง จำนวน edge ทั้งหมดที่ต้องสร้างจะเท่ากับ O(nk)\mathcal{O}(nk)

ดังนั้นเราจึงได้อัลกอริธึมในการแก้ปัญหาข้อนี้ในเวลา O(nk)\mathcal{O}(nk)