แหล่งอ้างอิง: https://cses.fi/book/book.pdf
"จงหาระยะทางที่ยาวที่สุดระหว่างโหนด 2 โหนดใดๆ ในต้นไม้ที่มี ( n ) โหนด"
ตัวอย่างโจทย์: https://cses.fi/problemset/task/1131
1. DFS จากโหนด ( a ) ใดๆ เพื่อหาโหนด ( b ) ที่ไกลที่สุด
2. DFS จากโหนด ( b ) เพื่อหาโหนด ( c ) ที่ไกลที่สุด
3. ระยะทาง ( dist(b, c) ) คือคำตอบ
สำหรับแต่ละโหนด ( x ) ให้คำนวณ:
- ( toLeaf(x) ): เส้นทางยาวสุดไปหาใบ
- ( maxLength(x) ): เส้นทางยาวสุดที่มี ( x ) เป็นจุดสูงสุด
เพิ่มเติม: https://cses.fi/book/book.pdf (Chapter 14.2)
"จงหาบรรพบุรุษลำดับที่ ( k ) ของโหนด ( x ) ในต้นไม้ที่มีราก (Rooted Tree)"
ตัวอย่างโจทย์: https://cses.fi/problemset/task/1687
Preprocessing ( O(n \log n) ):
สร้างตาราง ( up[v][k] ) เพื่อเก็บโหนดบรรพบุรุษลำดับที่ ( 2^k )
Query ( O(\log k) ):
แตกค่า ( k ) เป็นเลขฐานสอง แล้ว "กระโดด" ขึ้นไปตามตำแหน่งบิตที่เป็น 1
ศึกษาเทคนิค: https://usaco.guide/gold/LCA
"จงหาโหนดที่เป็นบรรพบุรุษร่วมที่อยู่ลึกที่สุดของโหนด ( a ) และ ( b )"
ตัวอย่างโจทย์: https://cses.fi/problemset/task/1135
เป็นปัญหาพื้นฐานที่ใช้ในการหาระยะทางระหว่างโหนดและตรวจสอบความสัมพันธ์ในกราฟต้นไม้
ข้อมูลเพิ่มเติม: https://cses.fi/book/book.pdf (Chapter 18.3)
"จงหาจำนวนเส้นเชื่อมระหว่างโหนด ( u ) และ ( v ) ใดๆ ในต้นไม้ (Unweighted)"
ต้นไม้มี ( 2 \cdot 10^5 ) โหนด และมีคำถาม ( 2 \cdot 10^5 ) ข้อ
**คำใบ้**: ระยะทางจากโหนดหนึ่งไปอีกโหนดหนึ่งต้องผ่าน LCA เสมอ
dist(a, b) = depth(a) + depth(b) - 2 \cdot depth(LCA(a, b))
1. หาความลึก ( depth ) ของทุกโหนดด้วย DFS เพียงครั้งเดียวในขั้นตอน Preprocessing
2. หา LCA ของโหนด ( a ) และ ( b ) ด้วยเทคนิค Binary Lifting ในเวลา ( O(\log n) )
3. แทนค่าในสูตรเพื่อรับคำตอบในเวลา ( O(1) ) หลังได้ LCA
รายละเอียด: https://cses.fi/book/book.pdf (Chapter 18.3)
- Tree Diameter
- Tree Distances I & II
- Company Queries I & II
- Distance Queries
- Problem P: Independent Set
- Problem U: Grouping
(สำหรับฝึกฝน Tree DP ขั้นสูง)
Coding Time: 15.00 - 17.00