学习笔记
关于学习笔记这种东西,我想过很久,认为还是要发的。每当我们遇到一个题并且发现题目有多种解,我们需要在做对这道题的基础上学习一种新算法,这可以使我们增进知识,也可以对新算法的应用有一个了解。
正题
下面进入正题,首先我们要明确一个目标,真正学这个东西的意义是什么?为了解决题目。到最后我们会学到有源汇,有上下界的最大流。为了解决餐巾计划问题,我们必须从这个开始学起。
我们要学的就是无源汇可行流。
给出一张图,有n个点,图中的某两个点之间有一条流量下限为a,上限为b的边。(u->v),求每条边的流量为何值时,图中的流量可以无限循环。
第一行输入n,m,表示n个点m条边。
第二行到第m+1行,输入u,v,a,b,表示u到v有一条边,下限是a,上限是b。
输出:第i行表示第i条边应该流的流量。
样例输入: 样例输出:
3 3 2
1 2 1 3 2
2 3 2 3 2
3 1 1 3
-------------------------------------------------上面是废话--------------------------------------------
上面的题还是很必要读一读的。
图如下:
【依旧那么漂亮。。。】
为了保证每一条边都至少流a,我们使现在的边流量取消上下界,变为b-a。
就变成下面这张图的样子。
但是我们发现,如果边都流下限的话,不能达成流量平衡。就是说,点一送1流量到点二(因为下限是1),但是点二要送2流量到点三,这时候很明显点二没有那么多流量可以送去点三,所以只能送去1流量到点三,但是在新图中没有表示出来,所以在新图中,我们把二点连多一条边到end点,流量为1(2-1=1)。表示在附加流中,我们要使其中的流量分一点补回来点二到点三的流量。相同的,虽然点二没有只送了1流量到点三,但是实际上已经流了2流量过去,因为不足的流量可以在附加流中补足。所以现在点三有2流量那么多,但是他走3->1这条边,只能流1流量出去,那残余的流量怎么办呢?那就建一条st到3的边,流量为1(2-1=1)。表示有多余的1流量,可以在附加流中使用。
所以我们来总结一下建边规则:
1.原来的边,上限是a,下限是b。
设chaflow[i]=流出这个点的边的下限总和-流入这个点的上限总和。
2.当chaflow[i]>0,也就是说流出这个点的边的下限总和>流入这个点的边的下限总和,那么这个点的流量不够用,所以要在附加流中补足,向end建一条流量为chaflow[i]的边。
3.当chaflow[i]<0,也就是说流入这个点的边的下限总和>流出这个点的边的下限总和,那么这个点的流量多出来了,所以要在附加流中添加,st向i建一条流量为-chaflow[i]的边。
如下图。
跑一遍dinic,如果ed得到了所有到他这个点的边的权值和,也就是说到ed的边流满了,那么就有解。
每一条边的流量=下限流量+附加流中的流量。
否则无解,输出。
下堂课我们来把无源汇最大流,有源汇可行流和有源汇最大流学习完。谢谢大家支持!