1 条题解
-
0
题目理解
我们有一个无向图 ,包含 个顶点和 条边,需要给每个顶点分配一个观点值 ,满足:
- 对于每条边 ,有
- 持有极端观点( 或 )的顶点数尽可能多
问题转化
条件分析
条件 意味着:
- 图必须是二分图(否则存在奇数环时无法满足)
- 观点值可以看作在图上的一种"层号"分配
二分图结构
如果图是二分图,我们可以将顶点分为两个集合 和 ,使得:
- 相邻顶点属于不同集合
- 如果 且 相邻,则
算法思路
为奇数的情况
当 为奇数时,采用简单策略:
- 在每个连通分量中,选择较大的那个集合分配观点 (极端观点)
- 另一个集合分配观点
- 极端观点数为较大的集合大小
为偶数的情况
这是更复杂的情况,采用以下步骤:
-
构建冲突图:
- 对于 中的顶点 和 中的顶点
- 如果它们之间的最短距离 ,则在 和 之间连边
- 这是因为如果距离太近,可能无法同时给它们分配极端观点
-
二分图匹配:
- 在冲突图上求最大匹配
- 匹配数 表示必须放弃的极端观点对数
- 最终极端观点数为
-
观点分配:
- 通过构建残量网络和 BFS 标记
- 确定哪些顶点应该获得极端观点
- 使用 BFS 距离来分配具体的观点值
关键公式
极端观点数计算
对于 为偶数的情况:
其中 是冲突图的最大匹配数。
观点值分配
通过 BFS 距离 计算最终观点值:
$$x_v = \begin{cases} d[v] & \text{如果 } d[v] \leq k \\ k - ((d[v] - k) \bmod 2) & \text{否则} \end{cases} $$代码中的实现
核心步骤
- Floyd-Warshall:计算所有点对最短路径
- 二分图检测:DFS 染色验证图是否为二分图
- 冲突图构建:对于 中的 和 中的 ,如果 则连边
- 匈牙利算法:在冲突图上求最大匹配
- 残量网络分析:确定最终哪些顶点获得极端观点
- BFS 距离分配:根据标记结果分配具体的观点值
时间复杂度
- Floyd-Warshall: ,由于 ,可行
- 二分图匹配:
- 总体复杂度在给定数据范围内可接受
算法正确性
该算法基于以下保证:
- 如果不是二分图,直接输出
NIE
- 为奇数时,简单分配策略是最优的
- 为偶数时,通过冲突图匹配找到必须放弃的极端观点对是最优的
- 最终的 BFS 距离分配确保满足相邻顶点观点差为
算法标签
- 图论
- 二分图
- 最大匹配
- 最短路径
- BFS/DFS
代码总结
代码的核心是:
- 二分图检测和染色
- 根据 的奇偶性采用不同策略
- 为偶数时使用冲突图匹配来最大化极端观点数
- 通过 BFS 距离分配确保观点值满足相邻差为 的条件
这种方法能够在多项式时间内解决问题,并找到持有极端观点数最大的合法分配。
- 1
信息
- ID
- 3101
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 14
- 已通过
- 1
- 上传者