线段树优化建图学习笔记
使用场景:单点向区间,区间向单点或区间向区间建边。
实现原理:用线段树的一个节点管辖一段图上区间的顶点。
实现步骤:
- 将原图中的顶点拆点(理论上,实际代码中不需要),出点和入点。
- 建立两棵线段树,出点的树和入点的树。
- 出点的树由子节点连向父节点,边权为 \(0\),入点的树由父节点向子节点连边,边权为 \(0\)。
使用方法:
- 单点 \(x\) 与单点 \(y\) 连边,则用出点的树上编号 \(out_x\) 连向 \(y\) 的入点 \(in_y\)。
- 单点 \(x\) 向区间顶点 \([lt,rt]\) 连边,\(out_x\) 向入树的根节点递归连边。
- 区间顶点 \([lt,rt]\) 向单点 \(x\) 连边,出树从根节点递归向 \(in_x\) 连边。
- 区间顶点 \([lt,rt]\) 向区间 \([lt2,rt2]\) 连边,虚拟一个节点 \(v\),转化为 \(2\) 和 \(3\) 连边。