无源汇有上下界可行流详解(loj115)

例题链接
先解释一下流量平衡。
每条边有出发点和结束点。
出发点就有流出的流量,结束点就有流入的流量。
流量平衡是所有节点流入流量等于流出流量。

这种问题的思想就是:
在一个初始流的基础上加上一个附加流。
每条边的流量有上下界。那么初始每条边的流量就为每条边的下界。
用d数组表示每个点的流入量-流出量。

那么:
附加流的流出量-流入量就应该等于初始流的流入量-流出量。
这样的话两个流的流量加起来才能达到流量平衡。
也就是附加流的流出量-流入量应该等于d[i]。

那么来分情况讨论:
首先建立源点和汇点(st和ed)

如果d[i]>0(也就是初始流入量大于流出量):
那么附加流的流出量就要大于流入量。
那么我们要给附加流的流出量一个过来的地方。
所以从st到i建一条流量为d[i]的边。

如果d[i]<0(也就是初始流入量小于流出量):
那么附加流的流出量就要小于流出量。
那么我们要给多出来的流出量多一个去的地方。
所以从i到ed建一条流量为-d[i]的边。

如果d[i]=0(也就是初始流入量等于流出量):
那么该点处于流量平衡状态,不用做任何事情。

然后点与点之间就按照原来的关系建边即可,边权为up-down(上界-下界)
因为附加流肯定不会大于上界-下界的嘛。

最后跑完最大流后每条边的反向边的权值就是答案。
因为跑完最大流后每条边减少的流量等于它反向边的流量。

建完边后从st出发的边如果都是满流的话,那么整个图就是有解的。
否则没解(这个就不多加解释了吧)

剩下的没什么了吧。
代码实现:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n,m,st,ed;
struct node {
    int x,y,c,other,next;
}a[41000];int
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值