例题链接
先解释一下流量平衡。
每条边有出发点和结束点。
出发点就有流出的流量,结束点就有流入的流量。
流量平衡是所有节点流入流量等于流出流量。
这种问题的思想就是:
在一个初始流的基础上加上一个附加流。
每条边的流量有上下界。那么初始每条边的流量就为每条边的下界。
用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 last[210],len;

本文详细介绍了无源汇网络流问题,重点解析了流量平衡的概念和附加流的构建方法。通过建立源点和汇点,根据每个节点的流入量与流出量的差值调整附加流,确保总流量平衡。当每条边的反向边权值为最大流减少的流量时,即可得到解。最后,文章提到了代码实现的相关提示。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=77970978&d=1&t=3&u=4d9451215e6245f9aa42f172d078c15a)
404

被折叠的 条评论
为什么被折叠?



