ภาพรวมปัญหา
หาความห่างระหว่างสองโหนดในต้นไม้ไบนารี (จำนวนขอบที่ต้องเดิน) โดยใช้วิธี O(log n) ต่อคำถาม
หลักการ
Distance(u, v) = Level[u] + Level[v] - 2 × Level[LCA(u, v)]
ใช้ Euler Tour + Segment Tree เพื่อหา LCA แบบ O(log n)
ขั้นตอน
- คำนวณ Level ของทุกโหนดด้วย BFS
- สร้าง Euler Tour Array
- สร้าง Segment Tree บน Euler Tour สำหรับ RMQ (Range Minimum Query) เพื่อหา LCA
- ตอบคำถามแต่ละคำถามใน O(log n)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
#define MAX 1000
using namespace std;
// ... (โค้ดเต็มสำหรับ Euler Tour + Segment Tree LCA)
// ดูรายละเอียดในเนื้อหาต้นฉบับ
int main() {
// สร้างต้นไม้ตัวอย่าง
// ตอบคำถามระยะห่าง
return 0;
}
ผลลัพธ์ตัวอย่าง
Distance between nodes: 2, 4, 3, 1