有源汇有上下界最大流详解(loj116)

本文详细讲解了如何解决有源汇有上下界最大流问题,通过建立超级源点和超级汇点,转化为无源汇问题,并提供解题思路及代码实现,强调理解流量含义和构图关键。

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

例题链接
首先吐槽一下放题人(我不知道是不是我理解错了什么。)
题目描述里就一个上下界然后就说要求最大流。。。
直接建上界然后跑最大流不就完了么??
实际上原题是这样的:
求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制。在这些前提下要求总流量最大。

没学过无源汇有上下界可行流的看这里
可行流我不刚学完么。。想了想。。
上一题是无源汇的,而这道题是有源汇的。
那么我只要将他变成循环流就可以了嘛(其实就是变成无源汇而已)
那么从汇点到源点建一条流量无限的边那么这个图不就变成无源汇了嘛。
然后建一个超级源点和超级汇点。(st和ed)
按照上一题的d来连边。

如果d>0建一条st到i的边。
如果d<0建一条i到ed的边。
跟上一题一模一样(无源汇有上下界可行流)

然后判断一下从st出发的边是否满流(满流则有解,不满则无解)

因为第一次跑完最大流之后求得的是流满下界的流
那么图里还剩许多s到t的自由流。
所以剩下的把st和ed删掉。把与st和ed相连的边也删掉。
然后在剩下的图上跑一次从s到t的最大流即可。
那么最终答案就是流满下界的流+残余的自由流

代码实现:

#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;
int work[210],h[210],list[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值