学习笔记

    关于学习笔记这种东西,我想过很久,认为还是要发的。每当我们遇到一个题并且发现题目有多种解,我们需要在做对这道题的基础上学习一种新算法,这可以使我们增进知识,也可以对新算法的应用有一个了解。

正题

      下面进入正题,首先我们要明确一个目标,真正学这个东西的意义是什么?为了解决题目。到最后我们会学到有源汇,有上下界的最大流。为了解决餐巾计划问题,我们必须从这个开始学起。

      我们要学的就是无源汇可行流。

      给出一张图,有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的边流满了,那么就有解。

每一条边的流量=下限流量+附加流中的流量。

否则无解,输出。

下堂课我们来把无源汇最大流,有源汇可行流和有源汇最大流学习完。谢谢大家支持!

相关文章: