1 条题解
-
0
题目分析
本题是 JOI Open 2014 Day2 T1「移住計画 / Project of Migration」,属于计算几何与图论相结合的优化问题。题目要求将 个民族分配至 个给定的坐标点(),每个民族占据一个不同的居住区,并在具有友好关系的民族对之间建立直线铁路轨道。目标是最小化铁路轨道之间的交叉对数。
问题建模
1. 基本符号
- 图 ,其中 是民族集合, 是 条友好关系边。
- 点集 ,其中 。
- 分配方案 ,为单射。
- 对每条边 ,对应线段 。
2. 交叉数定义
定义 交叉数 为: $ C(\pi) = \#\{ \{e_1, e_2\} \subseteq E : e_1 \neq e_2, \text{线段}[\pi(u_1),\pi(v_1)] \text{与} [\pi(u_2),\pi(v_2)] \text{在内部相交} \} $ 注意:
- 只统计内部相交(端点相交不计)。
- 允许多于两条边交于同一点(这种特殊情况不影响计数)。
- 目标是求 。
理论性质与难点
1. 完全图情况
若 是完全图 ,则问题等价于:在 个点中选 个点,将 直线段画在这些点上,最小化交叉数。
已知结论(交叉数理论):完全图 的直线段画在任意点集上的最小交叉数为 ,但当点集呈凸位置时,最小交叉数为 (任意四条点确定的四边形产生一对交叉)。这提示我们:当 稠密时,应优先选择凸包上的点分配给度数大的顶点。2. 稀疏图情况
较小时,可能找到无交叉的分配(即 ),这等价于将 平面直线段嵌入到给定点集 的某个子集上。
已知判定一个图能否直线段画在给定点集上无交叉是 NP-hard 问题(即使 是匹配)。因此本题必须用启发式方法。3. 交叉的几何判定
两线段 与 在内部相交的充分必要条件是: $ \text{ccw}(A,C,D) \neq \text{ccw}(B,C,D) \quad \text{且} \quad \text{ccw}(A,B,C) \neq \text{ccw}(A,B,D) $ 其中 表示点 的逆时针方向(>0 逆时针,<0 顺时针,=0 共线)。利用此公式可在 判断一对边是否交叉。
启发式算法思路
1. 局部搜索(Local Search)
初始分配可以随机或贪心生成,然后反复尝试交换两个民族的居住区,若交换减少 则接受。
计算 的变化量 可只考虑涉及交换顶点的边,这样单次更新复杂度 而非 。2. 模拟退火(Simulated Annealing)
局部搜索易陷入局部最优,可用模拟退火:以概率 接受较差解。
温度 从高到低衰减,迭代足够次数。
每次随机选取两个民族交换,计算 。3. 基于点集几何结构的贪心
观察数据范围 ,点集 一般分布均匀,无三点共线。策略:
- 计算 的凸包,将凸包上的点分配给 中度数最大的顶点集合。
- 理由:凸包上的边较少与其他边交叉(仅在凸包内部穿出时才易交叉)。
- 内部点按某种空间填充曲线(如 Hilbert 曲线)排序,再按顶点 BFS 序分配,使相邻顶点在几何上接近,减少边长从而减少交叉。
4. 增量构造
按某种顺序(如度数从大到小)依次为顶点选择居住区,每次选择使当前已确定边交叉数增加最小的未使用点。
这需要维护已画出的边集合,对新点 与已分配点的所有边判断交叉。复杂度 , 时可行。5. 利用图的平面性子图
若 是平面图,理论上可画在任意点集上使得边为直线段且无交叉(Fáry 定理),但要求点集任意,而本题点集固定,故不一定能 。但我们可以:
- 找出 的一个最大平面子图 。
- 将 嵌入到 的一个子集上,尽量无交叉。
- 将剩余的边加上,此时必然产生交叉,但尽量少。
交叉数计算优化
直接计算 需 对边检查, 可达 ,可行。但在模拟退火中需多次计算,需优化:
- 维护一个 的交叉矩阵(布尔型),更新时只修改涉及交换顶点的边对应的行和列。
- 用 bitset 加速交叉检测:将点编号,预计算每对点是否可能连线(无直接用处),但对 检查, 时 次 ccw 计算可接受。
针对测试点特性的策略
观察 5 个测试点的参数:
测试点 特点 1 30 50 60 小规模,可较精确优化 2 125 124 300 , 是树 3 200 2000 400 稠密图,近似完全图 4 250 350 250 ,点与顶点一一对应 5 300 1600 500 较大规模,中等密度 针对性方法:
- 测试点 2: 是树()。树总可以画在平面上无交叉(平面图),但要画在固定点集上可能仍需交叉。可使用双重心法:选根,DFS 序映射到点集的某种顺序,尽量使父子在几何上接近。
- 测试点 3:,,接近完全图。重点利用凸包点分给大度数顶点。
- 测试点 4:,必须用尽所有点。此时问题是经典图绘制在固定点集,无选择余地。可尝试迭代改善:交换顶点对应的点,直接优化。
- 测试点 1 和 5:可用模拟退火结合贪心初始解。
几何技巧
1. 极角排序
对每个已选点 ,将其他点按相对于 的极角排序,快速判断射线穿过的边,用于估计交叉数。
2. 交叉数下界估计
对于 ,已知其交叉数(crossing number) 是画在平面上任意位置的最小交叉对数(边可弯曲)。直线段画在固定点集上的交叉数 。可计算一个松弛下界。
3. 分治策略
将点集用一条直线分成两半,将 的顶点按某种割平衡分配至两侧,使连接两侧的边尽量少。递归进行。
实现流程建议
- 读入数据,计算每个顶点度数 。
- 点集处理:计算凸包,对凸包点按顺时针编号;内部点按 坐标或 Hilbert 曲线顺序编号。
- 初始分配:
- 将凸包点按度数从大到小分配给顶点。
- 剩余顶点按 BFS 序(从已分配的高度数顶点出发)分配剩余点,选择使当前交叉数增加最小的点。
- 局部优化:
- 重复多次:随机选两个顶点,计算交换后的 ,若 或按模拟退火概率接受,则交换。
- 可并行尝试多个随机种子。
- 输出最终分配。
理论启示
本题是固定点集上的直线段图绘制(Straight-line graph drawing on fixed vertex locations)的交叉数最小化问题。在计算几何中,即使判定 是否可能也是 NP-hard。因此,JOI 官方对本题的评分机制( 和 )允许非最优解:只要 即可得分, 可得满分 分。
这表明在实际比赛中,不必追求绝对最优,而应设计稳定的启发式算法,在时限内得到 较小的解。
总结
本题结合了:
- 图论:顶点分配、交叉数概念。
- 计算几何:线段相交判定、凸包、点集排序。
- 组合优化:启发式搜索、局部改进。
核心思想是:利用点集的几何结构指导顶点分配,再通过局部交换迭代优化交叉数。
- 1
信息
- ID
- 5994
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者