2018年1月30日训练日记

通过看资料简单的知道了:求最大流等价于求最小割也等价于求最大权闭合图。

至于费用流:费用流问题即在以上的基础上添加了费用的概念,百度百科的解释是在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以在流量最大的前提下,达到所用的费用最小的要求。我们知道最大流的方案是不唯一的,又知道每条边上的单位费用,在此条件下让费用最小或者最大。最大费用只需建图时费用取反,跑最小费用流,结果取反即可。

好题:hdu 3667 Transportation拆边费用流(好题)

然而,网络流最主要的还是要学会建模。一定要善于画图。注意割点转化成割边问题。

判定网络流模型是否正确的两个原则:
1、可行性原则:原题中的每一种可行方案,在建立的网络流模型中都对应着一个“能求出的”流(一般是满足一定的条件的流,比如某些边必须满流等),注意这里的对应必须是“一一对应”,就是,既不能有可行方案丢失,也不能出现不可行方案;
2、最优性原则:原题中的最优方案(准确来说是最优方案的结果),在建立的网络流模型中都对应着一个“能求出的”量(最大流量或者满足最大流量的前提下的最小费用),也就是,最优结果必须是可以通过这个模型求出的。
一个网络流模型正确,当且仅当其符合以上两条原则。

无源汇上下界的最大流:建立超级源点ss和超级汇点tt,流量上下界变为[0,r-l],du[i]记录每个点流入的流量的流出的流量差总和,大于0连源点到该点流量d[i]的边,小于0连该点到汇点流量-d[i]的边,求最大流,最大流等于所有du[i]>0的和即为有解。输出每条边流量的话别忘了加下界。

有源汇上下界的最大流:建立源点s和汇点t,根据题意连边,流量上下界变为[0,r-l],du[i]记录每个点流入的流量的流出的流量差总和。连接t到s容量无穷的边,建立超级源点ss和超级汇点tt,大于0连ss到该点流量d[i]的边,小于0连该点到tt流量-d[i]的边,求最大流,最大流等于所有du[i]>0的和即为有解。若有解,直接求s到t的最大流,即为最终答案。输出每条边流量的话别忘了加下界。

有源汇有上下界的最小流:(来自某位大佬的博客)
1、du[i]表示i节点的入流之和与出流之和的差。
2、增设超级源点st和超级汇点sd,连(st,du[i](为正)),(-du[i](为负),sd)。 //增设超级源点和超级汇点,因为网络中规定不能有弧指向st,也不能有流量流出sd。
3、做一次maxflow()。
4、汇点(Sd)和源点(St)连一条容量为oo的边。
5、再做一次maxflow()。
6、当且仅当所有附加弧满载时有可行流,最后答案为flow[(Sd->St)^1],St到Sd最大流就是Sd到St最小流。

关于网络流求最大流的模板可谓各式各样,各种优化,但是实际上除了自己写的朴素Dinic算法(1684ms)之外只找到了一个可以用的比较快的模板(140ms),其他模板不是tle就是样例过不了要不就编译不通过,但是主要思路还是Dinic。虽然看了不少博客以及比较多的题目(最大流and最小割),但是依然不会建模,而且一般题目的输入都比较迷。。。明天继续看吧,希望能学透它。。。

加油。


你可能感兴趣的:(训练日记,图论,网络流)