มาราธอน

o62_may07_marathon

สำหรับข้อนี้ จะเป็นการถามหา shortest path ระหว่างคู่จุด หลาย ๆ คู่ โดยรับประกันว่าถามระหว่างคู่ที่จุดเริ่มต้นอยู่ในเซต SS และจุดสิ้นสุดอยู่ในเซต TT บนกราฟที่มีเงื่อนไขพิเศษ คือระหว่างจุดเริ่มต้นใด ๆ ไปยังจุดสิ้นสุดใด ๆ จะผ่านจุดยอดอื่น ๆ อย่างน้อย 10001\,000 จุดยอดเสมอ กล่าวคือ sS,tT,[udist(s,t)1001]\forall s \in S, \forall t \in T, [udist(s,t) \geq 1\,001] และกราฟเป็นกราฟมีน้ำหนัก ไม่ระบุทิศทาง และเชื่อมต่อกัน

สำหรับสัญลักษณ์ในเฉลย กำหนดให้

  • dist(u,v)dist(u, v) แทนระยะห่างจากจุดยอด uu ไปยังจุดยอด vv บนกราฟระบุทิศทางที่โจทย์กำหนดมาให้
  • udist(u,v)udist(u, v) แทนระยะห่างจากจุดยอด uu ไปยังจุดยอด vv โดยไม่นับน้ำหนัก (กล่าวคือ จำนวนเส้นเชื่อมที่น้อยที่สุดที่เป็นไปได้ของ path จาก uu ไป vv สำหรับแต่ละ path ใด ๆ)

Observation 1

สังเกตว่า สำหรับกราฟเชื่อมต่อไม่ระบุทิศทางใด ๆ สมมติ pp เป็น articulation point ที่แบ่งกราฟออกเป็นหลาย connected component และ uu กับ vv อยู่คนละ component หลังจากการแบ่งกราฟแล้ว จะได้ว่า path ใด ๆ ที่เชื่อมต่อระหว่าง uu กับ vv จะต้องผ่าน pp

หมายเหตุ เราจะกล่าวว่า pp เป็น articulation point ของกราฟต่อเนื่องไม่ระบุทิศทาง G=(V,E)G = (V,E) ก็ต่อเมื่อ หากนิยาม E={vV{p,v}E}E' = \{v \in V | \{p, v\} \in E\} (นั่นคือ EE' เป็นเซตของเส้นเชื่อมที่ติดกับ pp) แล้ว G=(V,EE)G' = (V, E \setminus E') จะเป็นกราฟใหม่ที่ไม่ต่อเนื่อง กล่าวคือ pp จะเป็น articulation point ก็ต่อเมื่อ การลบ pp ออกจากกราฟทำให้กราฟขาด

ยกตัวอย่างเช่นภาพด้านล่าง

รูปที่ 1

หากพิจารณาทุก path จาก ss ไปหา tt จะจำเป็นต้องผ่าน p1p_1 แน่ ๆ เพราะเมื่อนำ p1p_1 ออกจากกราฟจะแบ่งกราฟออกเป็นหลายส่วน และทำให้ ss กับ tt อยู่คนละส่วนกัน

Observation 2

สังเกตว่า สำหรับกราฟ G=(V,E)G = (V,E) ที่เป็นกราฟเชื่อมต่อไม่ระบุทิศทางใด ๆ สมมติมีเซต SVS \subseteq V และ TVT \subseteq V ที่ ST=S \cap T = \emptyset ถ้า เรารับประกันได้ว่า มี เซต PVP \subseteq V ที่มีสมบัติ เมื่อนำจุดยอดภายในเซต PP ออกจนหมดแล้วทำให้ไม่มี path ใด ๆ เลยที่เชื่อมระหว่าง sSs \in S ใด ๆ กับ tTt \in T ใด ๆ (กล่าวคือ PP เป็น s-t cut ของกราฟ GG) แล้ว shortest path จาก sSs \in S ใด ๆ ไปหา tTt \in T ใด ๆ จะผ่านอย่างน้อยหนึ่งจุดยอดใน PP

ยกตัวอย่างเช่นภาพด้านล่าง

รูปที่ 2

หากกำหนดให้ S={s1,s2}S = \{s_1, s_2\} และ T={t1,t2,t3}T = \{t_1, t_2, t_3\} และ P={p1,p2,p3}P = \{p_1, p_2, p_3\} (จะเห็นได้ว่ามีสมบัติข้างต้น คือเมื่อตัด PP ออกจากกราฟไปแล้วทำให้ SS ไม่สามารถไปหา TT ได้เลย) แล้วจะสังเกตได้ว่า shortest path จาก sSs \in S ใด ๆ ไปยัง tTt \in T ใด ๆ จะต้องผ่านอย่างน้อยหนึ่งจุดยอดใน PP

ข้อสังเกตดังกล่าว สามารถคิดต่อได้จากข้อสังเกตแรก หากเราสามารถหาเซต PP ที่แบ่งแยกส่วน SS ออกจาก TT ได้เราก็จะได้ว่ายังไง PP ก็เป็นส่วนจำเป็นที่จะต้องใช้ผ่านทาง ระหว่าง SS ไปหา TT

Observation 3

สังเกตว่า สำหรับกราฟใด ๆ สำหรับจุดยอด s,ts, t ที่ sts \ne t ใด ๆ ในกราฟ หากสามารถรับประกันได้ว่ามี shortest path อย่างน้อย 1 วิธีที่ผ่านจุดยอด pp แน่ๆ เราจะทราบว่า dist(s,t)=dist(s,p)+dist(p,t)dist(s, t) = dist(s, p) + dist(p, t)

ข้อสังเกตนี้ เป็นข้อสังเกตที่สังเกตได้ไม่ยาก แต่มีประโยชน์ต่อข้อนี้มาก

Randomized Solution

เมื่อเราทราบข้อสังเกตทั้ง 3 ข้อแล้ว และพบว่ากราฟนั้นมีระยะห่าง (ไม่นับน้ำหนัก) ระหว่าง sSs \in S ใดๆ กับ tTt \in T ใดๆ มาก เราจึงได้ข้อสังเกตเพิ่มเติมว่า น่าจะมีเซต PP จาก Observation 2 ที่มีขนาดเล็ก เพราะเส้นทางน่าจะซ้ำกันเยอะ เราจึงทำการสุ่มหา PP ที่สอดคล้องกับเงื่อนไขของ Observation 2 ที่มีขนาดเล็กเพียงพอ (หากโชคดีพอจะได้ประมาณ 100100 ถึง 200200 จุดยอด ซึ่งเพียงพอต่อเวลา หรืออีกวิธีคือสุ่มมั่วจำกัดแค่ 100100 จุดยอดโดยไม่สนใจว่าสอดคล้องเงื่อนไขหรือไม่) หลังจากนั้น ทำ Dijkstra's Algorithm โดยหา single source shortest path จาก pPp \in P แต่ละ pp ไปหาทุกจุดยอด เมื่อมีคำถามแต่ละคำถามในรูปแบบ (s,t)(s, t) เมื่อ sSs \in S และ tTt \in T แล้วจะได้ว่า minpPdist(p,s)+dist(p,t)\min\limits_{p \in P}{dist(p, s) + dist(p, t)} เป็นคำตอบ (วิธีการจาก Observation 3)

จะได้ว่าใช้เวลาการทำงานรวมเป็น O(PMlogN)\mathcal{O}(|P|M \log N) แต่วิธีการนี้ยังไม่ใช่วิธีการที่ผู้เขียนต้องการให้ผ่าน

Min-cut Solution

ปัญหาต่อมาคือเราต้องการหาเซต PP ที่มีขนาดเล็ก ๆ และสอดคล้องกับ Observation 2 แน่ ๆ ปัญหานี้มีชื่อเรียกว่า Minimum s-t cut ซึ่งก็จะมี Randomized Solution ในการแก้อีกเช่นกัน (เช่นการประยุกต์ใช้ของ Karger's Algorithm) แต่จากการทดลองพยายามหา Minimum s-t cut แล้วจะใช้เวลาเกินเป็นส่วนใหญ่ และยังไม่สามารถทำให้ผ่านได้จริง

คำถามต่อมาคือ เราจำเป็นต้องหาเซต PP ที่เล็กที่สุดหรือไม่ ซึ่งแท้ที่จริงแล้วเราไม่จำเป็นต้องหาเซต PP ที่เล็กที่สุด แต่เพียงแค่หาเซตที่เล็กเพียงพอก็สามารถทำได้แล้ว

Lemma 4

สำหรับกราฟ G=(V,E)G = (V,E) ที่เป็นกราฟเชื่อมต่อไม่ระบุทิศทางใด ๆ ที่มีจำนวนจุดยอดไม่เกิน 5000050\,000 สมมติมีเซต SVS \subseteq V และ TVT \subseteq V ที่ ST=S \cap T = \emptyset และ sS,tT,[udist(s,t)1001]\forall s \in S, \forall t \in T, [udist(s,t) \geq 1\,001] จะได้ว่า มีเซต PVP \subseteq V (ที่มีสมบัติคือ เมื่อนำจุดยอดภายในเซต PP ออกจนหมดแล้วทำให้ไม่มี path ใด ๆ เลยที่เชื่อมระหว่าง sSs \in S ใด ๆ กับ tTt \in T ใด ๆ ) ที่ P50|P| \leq 50

Proof

ในการพิสูจน์ จะแบ่งออกเป็นสองส่วน ส่วนแรกคือการพิสูจน์ว่า จะมี 1d10011 \leq d \leq 1\,001 ที่ P={uVsS,udist(s,u)=d}P = \{u \in V | \exists s \in S, udist(s, u) = d\} มีขนาดไม่เกิน 5050 ส่วนที่สองคือการพิสูจน์ว่า PP ที่ได้จากส่วนแรกนั้น เป็น s-t cut ของ GG

เราเริ่มด้วยการหา multiple source shortest path จาก SS ไปยังทุกจุดยอดที่เหลือใน GG

หากสำหรับจุดยอด uu ที่เหลือใน GG มี d=minsSudist(s,u)d = \min\limits_{s \in S}{udist(s,u)} เราจะเขียนแทนด้วย udistS(u)=dudist_S(u) = d

เมื่อเราทำการแบ่งแยกจุดยอดต่าง ๆ ออกเป็นชั้นสมมูลตามค่า udistS(u)udist_S(u) ของแต่ละ uu (กล่าวคือ กำหนดให้ [d]={uVudistS(u)=d}[d] = \{u \in V | udist_S(u) = d\})

Part 1

ต่อมาจะพิสูจน์ว่า d,1d1001,[d]50\exists d, 1 \leq d \leq 1\,001, |[d]| \leq 50 โดยการพิสูจน์โดยข้อขัดแย้ง ดังนี้

สมมติให้ d,1d1001,[d]>50\forall d, 1 \leq d \leq 1\,001, |[d]| > 50 จะได้ว่าเซต [d][d] แต่ละเซตขนาดมากกว่า 50 แต่เนื่องจากมีเซตเหล่านี้อยู่ 10011\,001 เซต และไม่มีสองเซตใดที่ซ้อนทับกันอยู่เลย จึงได้ว่า i=11001[i]>501001=50050\left|\bigcup\limits_{i=1}^{1\,001}{[i]}\right| > 50 \cdot 1001 = 50\,050 ขัดแย้งกับที่กำหนดว่ามีจุดยอดไม่เกิน 5000050\,000 จุด

Part 2

ต่อมาจะแสดงว่า สำหรับ 1d10011 \leq d \leq 1\,001 ใด ๆ, [d][d] เป็น s-t cut ของ GG โดยการพิสูจน์โดยข้อขัดแย้ง ดังนี้

สมมติให้ 1d10011 \leq d \leq 1\,001 ที่ [d][d] ไม่เป็น s-t cut ของ GG จะได้ว่าหลังลบทุกจุดยอด uu ที่ udistS(u)=dudist_S(u) = d ออกไปจากกราฟแล้วยังทำให้สามารถเดินทางจากบาง sSs \in S ไปยังบาง tTt \in T ได้อยู่ เนื่องจากว่าใน path ระหว่าง sSs \in S กับ tTt \in T ใด ๆ เราทราบว่าจุดยอดที่ติดกันใน path จะมี udistSudist_S ต่างกันไม่เกิน 11 แน่นอน (สมมติว่าจุดยอดทั้งสองนั้นคือ a,ba, b โดยไม่เสียนัยทั่วไปหาก udistS(a)>udistS(b)+1udist_S(a) > udist_S(b)+1 เราสามารถเปลี่ยนค่า udistS(a)udist_S(a) เป็น udistS(b)+1udist_S(b)+1 ได้เลย โดยการเปลี่ยนจากเส้นทางเดิมเป็นเดินจาก bb ไปยัง aa) เมื่อทราบว่า udistSudist_S ต่างกันไม่เกิน 11 แน่นอน แสดงว่า udistS(t)<dudist_S(t) < d เพราะหาก udistS(t)dudist_S(t) \geq d จะได้ว่า มี aa ใน path จาก ss ไป tt ที่ udistS(a)=dudist_S(a) = d จาก Intermediate Value Theorem (discrete version) ขัดแย้งกับที่สมมติไว้ว่า udistS(t)1001udist_S(t) \geq 1\,001

ในจุดนี้ จึงสามารถสรุป Lemma 4 ได้

Solution

จาก proof ของ Lemma 4 นั้น เราอาศัย multiple source shortest path ในการกำหนดค่า udistS(u)udist_S(u) สำหรับแต่ละ uVu \in V แล้วเราพบว่าการกระทำดังกล่าวจะมี 1d10011 \leq d \leq 1\,001 ที่ [d]50|[d]| \leq 50 แน่ ๆ เราจึงใช้ข้อสังเกตนี้ทำการหา dd ดังกล่าว และกำหนด P:=[d]P := [d] เป็น s-t cut ที่นำมาใช้พิจารณา จะได้ว่าต้องทำการหา shortest path ไม่เกิน 5050 ครั้ง

จะได้ว่าใช้เวลาการทำงานรวมเป็น O(PMlogN)\mathcal{O}(|P|M \log N) เหมือนเดิม แต่รับประกันว่า P50|P| \leq 50