例题链接
首先吐槽一下放题人(我不知道是不是我理解错了什么。)
题目描述里就一个上下界然后就说要求最大流。。。
直接建上界然后跑最大流不就完了么??
实际上原题是这样的:
求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制。在这些前提下要求总流量最大。
没学过无源汇有上下界可行流的看这里
可行流我不刚学完么。。想了想。。
上一题是无源汇的,而这道题是有源汇的。
那么我只要将他变成循环流就可以了嘛(其实就是变成无源汇而已)
那么从汇点到源点建一条流量无限的边那么这个图不就变成无源汇了嘛。
然后建一个超级源点和超级汇点。(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],