摘要: 这里就想到了lrj说的理解EK但是使用Dinic 因为图较大,所以采用Dinic而不是EdmondsKarp 得益于接口一致性,无须理解Dinic就能使用它。 看到最小费用,又有隔开的操作(割),就是最小割,就想到了最大流(想了想用不到MCMF,这里挺需要注意的,所有网络流的题首先判断是MCMF还是 阅读全文
posted @ 2018-10-27 13:36 Erio 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 证明: 对于每一个X节点,都是只有一个入流,多个出流(分别流向每一个Y节点),显然多个出流的和正好等于入流;同理,对于每一个Y节点,有多个入流(分别来自每一个X节点),只有一个出流,显然多个入流的和等于出流。第一类弧,以每一行所有元素之和为容量;第三类弧,以每一列所有元素之和为容量;第二类弧,最终流 阅读全文
posted @ 2018-10-27 13:35 Erio 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 拆点法是很套路的方法,将一个点拆为i和i',连边,cap为1,cost为0. 编号:点2~n-1拆成弧i->i',前者编号为0~n-1,后者编号为n~2n-3 (i+n-2) 本题拆点后从1-v求流量为2的最小费用流 while(flow < flow_limit && BellmanFord(s, 阅读全文
posted @ 2018-10-27 13:35 Erio 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 网络流的问题一般都会加S,T! 网络流init参数一般为节点数(包括S,T) maxn为点数+一点(注意可能加点,拆点...) 把插头看做结点,增加S,T链接设备和插头(容量为1),转换器作为边(容量无穷大),套模板。用的是紫书第二种方法,因为更喜欢思维直接一点的方式。 读取输入时用一个ID函数方便 阅读全文
posted @ 2018-10-27 13:34 Erio 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 白书第一章例题4 思维。 先固定一点不动,假设最后一共N个点,那么编号为0,1,...N-1, 0不动,原来的n个点分别占据i/n*N的位置(记为pos),移动到pos四舍五入的位置即可。 证明一:有一个坐标未移动,见例题3(UVA11300) 证明二:没有点移动到相同位置。 假设x,y移动到相同位 阅读全文
posted @ 2018-10-27 13:33 Erio 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 白书第一章例题6 构造。思维。几何。 分别从几个角度去看,有矛盾就删掉,最后遍历一下统计个数 方法证明:第一个方块肯定要删除。假设前k个必须删除,第k+1个矛盾出现,假如不删掉,矛盾将持续存在,故必须删掉。 代码有很多细节。 比如注意宏定义加() //#define REP(i,n) for(int 阅读全文
posted @ 2018-10-27 13:32 Erio 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 白书第一章例题7 很套路了。枚举第一行,可以直接算出之后的几行。 #include <iostream> using namespace std; #include <stdio.h> #include <cstring> #define INF 10000000 int grid[20][20]; 阅读全文
posted @ 2018-10-27 13:32 Erio 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 白书第一章例题8 好麻烦! 正方体每面编号为0-5,那么根据顶点和正面,就能确定形态。一共6*4=24种形态。 P[i]表示编号i所在位置。比如P[1]=3,表示第二面转到了第四面。 就可以表示出所有形态。 这时候可以手算或者写个函数找出所有形态。 注意选择函数计算,要放到main外面,方便调。 注 阅读全文
posted @ 2018-10-27 13:31 Erio 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 习题9-9 注意前提是最小值最大。很少做两次dp的题。 初始化要细心。 阅读全文
posted @ 2018-10-27 13:30 Erio 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 状压dp 要再看看 例题9-17 阅读全文
posted @ 2018-10-27 13:29 Erio 阅读(225) 评论(0) 推荐(0) 编辑