UVa 1659 Help Little Laura 最大费用循环流

博客围绕平面上有向线段涂色得分问题展开,目标是使涂色得分最大。为用最小费用流建模,将边权取反,把最大费用循环流转换为最小费用循环流。通过找负费用增广圈求解,这等价于在残留网络中找负权圈,可用Bellman - Ford算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意: 

平面上有m条有向线段连接了n个点。你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点。你可以多次行走,给多个回路涂色(要么不涂色,要么就至少给一个回路上的边全部涂色)。可以重复经过一个点,但不能重复经过一条有向线段。如下图所示的是一种涂色方法(虚线表示未涂色)。每涂一个单位长度将得到X分,但每使用一种颜色将扣掉Y分。假设你拥有无限多种的颜色,问如何涂色才能使得分最大?输入保证若存在有向线段u -> v,则不会出现有向线段v -> u。n <= 100,m <= 500,1 <= X,Y <= 1000。对于坐标(x,y)0 <= x,y <= 1000。

\epsfbox{p4030.eps}

分析: 本来要找环使得分最大(即最大费用循环流),为了用最小费用流建模,就边权取反,然后找负环增广(转换成最小费用循环流)。这个问题的解决方法和最小费用最大流有些类似,只不过不是求一条s-t的最小费用增广路,而是找整个图的一个负费用增广圈。沿着负费用增广圈进行增广之后,每个节点的流量平衡不会被破坏,而整个循环流的总费用变小了。求解最小费用循环流的伪代码就是:

while(find_negative_cycle()) augment();

根据残留网络的概念不难得出:找负费用增广圈等价于在残留网络中找负权圈,这正是Bellman-Ford算法的拿手好戏。建图如下。

总结:最大费用循环流模板~。
代码:待补。参考https://blog.youkuaiyun.com/xl2015190026/article/details/52138200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值