本文目的是总结网络流的建模,所以Dinic 以及 Sap并不详讲。
但是在选用哪种算法时往往参照边的多少
Dinc O(m^2n)
Dinic 分层图一般dinic比较快
Sap O(m
n^2)

看到一道题目初步想到是网络流时
先是判断是网络流的哪种类型
1.最小割 使S不能到T 即x集合取xi 其所对应的y集合中的yj不能使用,二分图颇多。
2.费用流 约束很多 简单的最大流不能满足约束时 清晰表达边和点时 则需要给边增加费用。
3.最大流 和最小割类似 二分图居多,但性质不一样。
4.分层图 做的蛮少 有的是求最短路径啊,有的看起来就像DP一样(DP值会反复更新跟求最短路的dist一样因此spfa转移)
5.我还没学
重点!!!!!!
建图:
关键字:点,边,流。
首先掌握拆点
拆点就是将一个点的意义用多个点表达,方便建图。我们所拆的点往往有这些性质。
(1).限制经过或使用点的次数
(2).一个点有多重属性 属性之间存在联系。例如网络流24题之餐巾计划 a[i]表示第i天要用的餐巾,b[i]表示第i天用完的餐巾,a[i]与a[i+1]和b[i]有联系,而b[i]与a[i+fast_time],a[i+slow_time]存在联系。如果不拆点,用多少条边都无法表达这些联系。
例如:
1.进入该点(x[i])和出去该点(y[i])
这个点只被经过K次 add(x[i],y[i],k) (例题太多
2.点的入度(x[i])和点的出度(y[i])
If (map[i][j])add(y[i],x[j],1) (例题:hdu3488
3.第1..k天的这个点
分层图中使用 (例题:网络题24题之星际转移问题
PS:缩点也很重要可以有效减少时间复杂度 其做法是将入度和出度一样的点变成同一点 例如hdu3605

点:
确定点是建图最难的地方。
哪些点?这些点什么意义?这样的点可以能用边联系起来么?因为最难所以不讲方法,只讲例子(防误导2333333333333333333。
Hdu3572:
接触的第一个任务分配类题目
有n个任务,m个机器,n个任务分别要求用pi个时间点,
这些时间必须在 start[i]和end[i]之间,问是否能完成所有任务。
一开始想的是n个任务代表n个点,m个机器代表m个点,
搞了半天扯不到时间上去。
正解是用n个任务和 max(end[i])个时间点,每个时间点最多做m个任务,随便建边即可,这题选点较难,但是做完后去做了hdu2883和hdu2732(怎么感觉选完点这个题目太裸了)。
HDU3338:
好题!
干TM的脑洞题。
N*N的棋盘上一些黑白格子,白格子必须填1..9中的数。要求连续的一些竖着的格子之和或横着的格子之和都为给定的值。看不懂看http://www.cnblogs.com/ylfdrib/archive/2010/08/15/1799903.html
然后YY了一个晚上,连费用流都搞了就是搞不出来。
题解:
所有横着的白格子的数字总和=所有竖着的白格子的数字总和。
S连某一行,容量为白格子的横和,竖行连T,容量为白格子的竖和。看到这里就恍然大悟。。。。(迷啊,选点难啊),不拓展了。
HDU3488:
每个点都必须只能在一个环上,求环上的边的权值和最大。
分析题意,只在一个环上,所以每个点入度=出度=1,然后拆点乱搞(又是选点哈哈哈哈)。
HDU4067:
n个点,m条边,m条边连接u,v,选这条边用a费用,不选b费用,要求使除了给定的两个点 s和t以外所有的出度=入读,而s的入度比出度多1,t反之。
好题,YY了半天我竟然YY出了给定出度入度求最小费用的做法。妈呀,看错题目,然后又搞了半天,死于s和t上。

边:
确定点的意义后要开始建边。边的容量费用都是考虑的重点。
二分图独立集中,如果xi, yj存在冲突,则add(xi,yj,INF)。这样因为最小割必然不会割容量过大的边 而只会割 map[S,xi]or map[yj,T]。
在任务分配类模型中,连接点与点之间的点边使用k次,则add(i,j,k)。
费用流中 与S点和T点相连的点费用为0;
拆边:例题hdu3667 没啥好讲的 因为费用=流量c边权s,在遇到费用=流量边权s^2的时候,则拆成s条边。

 posted on 2016-01-07 16:49  wkingG  阅读(189)  评论(0编辑  收藏  举报