有向图:点无容量不用说,点有容量拆点。
无向图:
点无容量:正反边都有容量。
点有容量:拆点,一个代表出点,一个代表入点,入到出有点容量,出点连其他点入点。
以上是基本构图。
最大匹配 = 最小点覆盖 = 所有定点数 - 最大独立集
||
最小边覆盖
最小路径覆盖 = 原图点数 - 新图最大匹配(最小路径覆盖要拆点做)
以下转自http://tieba.baidu.com/p/2430347466
-
cfgbdnm: 加强版,求一号的最小得分:首先二分答案key,依然那么建图,但是将节点1的尚未确定的边也连上,然后把向外推的条件改为判断溢出值是否大于key。
-
cfgbdnm: 问题等价于求最多收多少次小弟(小妹)。
对于一般求sigma(V)-sigma(E)的问题(似乎应该叫最大权导出子图),直接转化为最大权闭合图问题求解即可。(PS:昨天明明想到正确的最大权闭合图的建图方案了,结果一时脑残以为那个方法是错的(就是从每个边向两边的点连有向边,但实际上只要边的权值都为正就是对的))。
最大密度导出子图求的是sigma(V)/sigma(E)=k:
二分k的值判断是否有sigma(V)>sigma(E)*k,将所有的点权*=k,建立最大权闭合图模型,如果该值>0,则存在。
可用最短路的方法求割值。
以前曾经做过BZOJ狼抓兔子,NOI海拔,知道是有这么一个方法的。
狼抓兔子这道题是直接连边即可。
海拔那道题边的两边的值不同,但有一个比较简单的处理方法,如果原图方向是从源到汇,最短路模型里就是从s到t,反之亦然。
-
cfgbdnm: 做法:for =each<域 i>{format f(i,s,t)=s||t?INF:0;for =each<j> exist(i->j){tranform i->j}end =for;f(i,s,t)=INF;DP_system.update();update =min<ans>{f(i,s,t) exist s^t};end =for;
以上转自http://tieba.baidu.com/p/2430347466
平面图求最大流转化成最小割。(海拔,狼捉兔子)(s与t都在最外面的区域中)
s与t在一个区域中,连接s和t,求s-t划分开的两个区域的最小割。
s和t不在一个区域中,s和t分别引射线,发现割开s和t的会 (过T的射线奇数次,过S的射线偶数次) || (过S的射线奇数次,过T的射线偶数次)。
因此每个点有两个域记录过s奇偶,过t奇偶,目标是由 每个点(过S偶过T偶 到 过S偶过T奇) || (过S偶过T偶 到 过S奇过T偶)
有个网格,有些障碍,判断是否存在多条哈密顿回路覆盖除去障碍的点。
黑白染色,黑与白个数不同一定无解。
然后 源 -2> 黑 -1> 白 -2> 汇,满流有解,否则无解。
因为回路上每个点连接两个异色。
//网格图注意黑白染色。
下面上道题:
有n个奶酪,m只老鼠,每个奶酪有个质量w[i],每个老鼠每个单位时间可以吃g[i];(w和g是整数)
一个奶酪每个时刻最多有一个老鼠吃,可以在任意时刻换老鼠吃。
问全吃完的最短时间(实数)。
二分答案,v是每个老鼠在时间内吃的总数。
按v从大到小排序分别是v1,v2......vm;
构图如下: