最大流
EMber _
人但有追求,世界亦会让路。
展开
-
bzoj3396 ISAP
分析:裸的最大流,顺便复习了一波ISAP,速度起飞,非常舒服。。#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define fo(i,a,b) for(ll i=a;i<=b;i++) #define fd(i,a,b) for(ll i=a;i>=b;i--) u原创 2017-03-29 21:09:22 · 221 阅读 · 0 评论 -
bzoj2718/1143 CTSC2008 祭祀 最长反链
经典题来着。。 其实就是求最长反链。 然后我们有Dilworth定理: 1.最长链=最长反链覆盖 2.最长反链=最长链覆盖 第一个我还没见过,等一下去查一查。第二个就是我们要用到的了。 证明http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/ 那么最长链覆盖=N-最大匹配。 那么很显然了,直接连边跑最原创 2017-07-31 15:34:21 · 252 阅读 · 0 评论 -
bzoj2756[SCOI2012]奇怪的游戏 二分 分类讨论 最大流
细节比较多的一道题目。 题意:给你一个矩阵,每次能把相邻的两个数都+1,问你最少多少次能把整个矩阵的数都变成同一个数。 网络流的模型比较明显,但是正解的话考场上可能不容易想到= =。 先把整个网格图黑白染色,设格子数和总和分别为num1,sum1,num2,sum2. 那么假设最终变成了X,那么最后的答案肯定是X*num1-sum1,即添加了多少次。 然后我们分类讨论。 num1!=nu原创 2017-07-30 20:50:38 · 217 阅读 · 0 评论 -
bzoj1733[Usaco2005 feb]Secret Milking Machine 神秘的挤奶机
明显二分答案。 然后对于这种求路径数量的一般都用网络流= = 每次二分出一个x,边小于等于x的才连,然后容量都为1,s到1和n到t连容量为要求路径总数的边,由于是双向边所以要连两次= =。#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd原创 2017-06-05 11:07:39 · 349 阅读 · 0 评论 -
bzoj [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流
很好的题目= =并没有想出正解= = 首先二分最短的路径x 然后每次二分的时候跑最大流。 每个牛拆成i和i’,起点向i连容量为数量的边,i’向终点连容量为容量的边。 如果i,j最短路小于二分的答案x就连i和j’容量为inf。#include<cstdio> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;原创 2017-06-05 09:50:30 · 308 阅读 · 0 评论 -
bzoj1711 [Usaco2007 Open]Dining吃饭 最大流
你看题目里都有个dini肯定正解是dinic啦 这道三分图匹配还不错。 把每头牛拆成两份,一份连喜欢的食物另一个连饮料。 两份互相连。 食物和饮料一个和起点连一个和终点连。 所有流量都是1.#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #define fo(i,a,b) for(int i原创 2017-05-29 19:54:29 · 278 阅读 · 0 评论 -
网络流24题 飞行员配对
随便连边,做了一定题目以后发现网络流套路还是比较浅的,当然仅限于简单题。#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;原创 2017-04-10 22:12:55 · 196 阅读 · 0 评论 -
bzoj1066 [SCOI2007]蜥蜴
分析:一个点拆成两个点然后跑最大流,发现原点汇点搞混了,,结果isap打挂了,只能打dinic,感觉hzwer的dinic是我看见的最简洁的。。#include<iostream> #include<cstdio> #include<cstring> #define inf 0x7fffffff using namespace std; struct data{int to,next,v;}e[50原创 2017-03-31 16:00:34 · 199 阅读 · 0 评论 -
bzoj1433[ZJOI2009]假期的宿舍
输出要用puts!!!!! 输出要用puts!!!!! 输出要用puts!!!!! 重要的事情说三遍。。分析:比较简单的网络流了,人向源连边,床向汇点连边,人向能睡的床连边,跑最大流,看看能不能全部睡咯。事实上,其实这也是网络流的经典套路,基本上能把题目化成两堆点,一堆向源连边,一堆向汇连边,然后两堆点之间互相连边。。#include<cstdio> #include<cstring> #in原创 2017-04-10 09:18:59 · 232 阅读 · 0 评论 -
bzoj1305[CQOI2009]dance跳舞
网络流是真的难想到正解。。%po姐姐的题解: 将一个人拆成两个点,点1向点2连一条流量为k的边,两个人若互相喜欢则点1之间连边,不喜欢则点2之间连边 对于每一个要验证的x值 将每个人的点1向源或汇连一条流量为x的边 然后二分答案跑最大流即可#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #def原创 2017-04-09 22:21:04 · 226 阅读 · 0 评论 -
网络流24题 05圆桌聚餐
题目描述 假设有来自 n n 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 r_i r i 。会议餐厅共有 m m 张餐桌,每张餐桌可容纳 c_i c i 个代表就餐。 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。 输入格式 文件第 1 1 行有 2 2 个正整数 m m 和 n n, m原创 2017-04-09 21:35:22 · 365 阅读 · 0 评论 -
网络流24题04 魔术球问题
Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,4的球。 (1)每次只能在某根柱子的最上面放球。 (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。 试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球。Input Format 文件第原创 2017-04-09 15:08:22 · 368 阅读 · 0 评论 -
loj6002网络流 24 题 最小路径覆盖 最大流
[每日一题网络流] 最小路径覆盖=n-最大匹配。 直接跑就好了。 还是不是很懂怎么构造方案。。#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #define T n+m+2 #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(in原创 2017-09-05 18:45:11 · 238 阅读 · 0 评论