การเดินทางโดยประหยัด (Budget Travelling)

toi13_traveler

ในข้อนี้ โจทย์สรุปเป็น variant หนึ่งของโจทย์ shortest path โดยจะต้องหาว่า ภายใต้งบ ZZ นั้น การเดินทางจาก XX ไป YY โดยเดินจาก XX ไปยัง VV แล้วให้จาก YY มารับจาก VV ไป จะได้ระยะทางสั้นสุดจาก YY ไปยัง VV เป็นเท่าใด หากเท่ากันหลายค่า ให้ตอบค่าที่ VV น้อยสุด

ในข้อนี้ เราจะใช้ Dijkstra's Algorithm ในการหา Shortest Path อย่างรวดเร็ว

สังเกตได้ว่าถ้าเราสามารถเดินทางโดยตรงจาก XX ไปยัง YY ในงบ ZZ เลยก็ง่าย คือเราจะทำเพียงหา Shortest Path จาก XX ไปยัง YY ก็จะเสร็จสิ้น แต่หากไม่สามารถทำได้เราจำเป็นจะต้องหา VV ที่ dist(X,V)Zdist(X, V) \leq Z และ ภายใต้ VV เหล่านี้ จะต้องหา minVdist(Y,V)\min\limits_{V}{dist(Y,V)}

วิธีเบื้องต้นคือไล่หาทุกๆ VV ที่เป็นไปได้ แล้วหาระยะทางจาก YY มายัง VV ซึ่งจะทำงานในเวลา O(NMlogN)\mathcal{O}(NM \log N) ซึ่งไม่ทัน

วิธีที่ดีสำหรับข้อนี้ คือการเริ่มหา Single Source Shortest Path (SSSP) จาก XX ไปยังทุกจุดที่เป็นไปได้ เท่านี้เราจะทราบว่ามีจุดใดบ้างที่สามารถไปถึงได้ โดยการกรองเฉพาะจุดที่ระยะห่างจาก XX มีไม่เกิน ZZ จุดเหล่านั้นคือค่าของ VV ที่เป็นไปได้ เพื่อความสะดวก จะเรียกเซตของจุดเหล่านั้นว่า SS ต่อมาทำ Single Source Shortest Path อีกครั้ง จาก YY ไปยังแต่ละจุดในกราฟ แล้วพิจารณาเฉพาะ distance ของจุดในเซต SS แล้วค่อยๆหาจุดที่มี distance ต่ำสุด หากเท่ากันให้นับจุดที่มีหมายเลขต่ำกว่า เป็น VV ที่ต้องการ เท่านี้จะได้ตามที่โจทย์ต้องการ

Time Complexity: O(MlogN)\mathcal{O}(M \log N)