1. 问题背景与理解
Laura Luo设计的这个绘画游戏实际上是一个有趣的图论问题。想象你面前有一幅由点和线组成的素描画,你需要用彩笔沿着线条画环来给画上色。每次画一个环,必须从某个点出发,沿着线条走,最后回到起点。每条线只能用一种颜色画一次,而不同的线必须用不同颜色。
这个游戏的计分规则很有意思:你画的每单位长度能得x分,但每使用一种颜色要扣y分。我们的目标是找到一种画环的方式,使得最终得分最高。
2. 问题建模与分析
2.1 图论模型建立
首先我们需要把这个问题转化为数学语言。可以把这幅画看作一个有向图:
- 每个点对应画中的一个点
- 每条有向边对应Laura指定的画线方向
- 边的长度就是两点之间的欧几里得距离
2.2 关键观察
- 环的性质:每个环必须满足流量守恒,即每个点的入度等于出度
- 边选择策略:
- 如果画某条边能带来正收益(长度×x > y),我们倾向于选择它
- 如果收益非正(长度×x ≤ y),我们最好不画它
- 容量限制:每条边最多被画一次
2.3 问题转化
这个问题可以转化为最大费用循环流问题。我们需要在有向图中选择一组边不相交的环,使得总收益最大化。这里的收益计算方式是:
code复制每条边的收益 = 长度 × x - y
总收益 = 所有被选中边的收益之和
3. 网络流解法设计
3.1 转化为最小费用最大流
虽然原问题是求最大费用循环流,但我们可以通过巧妙的转化,使用经典的最小费用最大流算法来解决。
3.1.1 正收益边处理
对于收益为正的边(u,v):
- 预先将profit加入总收益
- 在网络流图中添加反向边(v,u),容量1,费用为profit
- 调整度平衡:balance[u]--, balance[v]++
这样做的目的是:
- 预先计入收益,表示我们"希望"选择这条边
- 添加反向边,使得算法可以通过"退流"来放弃选择这条边(需要支付费用)
3.1.2 非正收益边处理
对于收益非正的边(u,v):
- 在网络流图中添加正向边(u,v),容量1,费用为-profit
- 这样算法会尽量避免选择这些边(因为选择它们需要支付费用)
3.1.3
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容