
【算法】最大流
文章平均质量分 73
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ1189】【HNOI2007】紧急疏散evacuate
【题目链接】点击打开链接【思路要点】问题中存在一种类似于流量限制的人流限制,考虑用网络流解决本题。枚举答案,对于每个时刻的每个位置分别建立一个点,简单建图后运行最大流,观察是否满流即可。常见的网络流\(Dinic\)算法中建立了反向边,因此可以在\(Ans=x\)的残量网络上加点后直接继续运行\(Ans=x+1\)的结果。最终图中的点数与边数均为\(原创 2018-01-12 09:54:57 · 469 阅读 · 0 评论 -
【BZOJ4200】【UOJ132】【NOI2015】小园丁与老司机
【题目链接】BZOJUOJ【思路要点】将所有点按照纵坐标排序,分别处理同一纵坐标的点。显然,每个点在各个方向上的后继点若存在,是唯一的,先预处理。记\(f_i\)表示从节点\(i\)出发,能够经过的最多的点数。若不考虑左右的移动,\(f_i\)就是\(i\)在三个方向上后继结点的\(f\)值的最大值加1,记这个值为\(tmp_i\)。不妨令同一纵坐标的点横坐标递增,那么有\(f_i=max\{tm...原创 2018-05-28 16:57:53 · 580 阅读 · 0 评论 -
【BZOJ3532】【SDOI2014】Lis
【题目链接】点击打开链接【思路要点】DP+拆点最小割可以解决第一问。按\(C_i\)从小到大考虑每一个点是否可以在最优解中被删除。首先,若该点内部的边没有满流,那么这条边一定不在最小割上,故该点不可能在最优解中被删除。否则我们考虑退掉该点内部边的在残量网络上的流量,并将其删去。具体退流的过程可以通过从汇点到该点出点,以及该点入点到源点各做一次流量限制为该点内部边的容量的最大流。若该点在最优解中可以...原创 2018-05-23 20:36:34 · 308 阅读 · 0 评论 -
【BZOJ5316】【JSOI2018】绝地反击
【题目链接】点击打开链接【思路要点】若知道环上某个点的最终位置,那么二分答案+最大流即可解决问题。因此,对环上第一个点的位置进行爬山。我们发现在大部分时候最优解是关于某个点的最终位置的周期函数,并且每个周期是单峰的,因此爬山在大部分时候是有正确性保证的。总时间复杂度\(O(Cnt*LogV*Dinic(N,N^2))\),其中\(Cnt\)为爬山次数。注:由于时间限制较紧,部分测试点的\(Cnt\...原创 2018-05-24 14:57:23 · 915 阅读 · 0 评论 -
【BZOJ4205】卡牌配对
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 70005#define MAXV 205#define INF 1e9template <typename T> void read(T &x) { x = 0; int f = ...原创 2018-06-21 17:08:06 · 322 阅读 · 0 评论 -
【BZOJ3996】【TJOI2015】线性代数
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 505#define MAXP 300005#define INF 1e9template <typename T> void read(T &x) { x = 0; int f =...原创 2018-06-21 20:54:19 · 267 阅读 · 0 评论 -
【BZOJ4519】【CQOI2016】不同的最小割
【题目链接】 点击打开链接 【思路要点】 GomoryHu-Tree模板题。 时间复杂度O(N∗Dinic(N,M))O(N∗Dinic(N,M))O(N*Dinic(N,M))。 【代码】 #include&lt;bits/stdc++.h&gt;using namespace std;#define MAXN 1005...原创 2018-07-03 11:20:38 · 264 阅读 · 0 评论 -
【BZOJ2229】【ZJOI2011】最小割
【题目链接】 点击打开链接 【思路要点】 建出GomoryHu-Tree ,剩余部分用DFS即可解决。 时间复杂度O(T∗(N∗Dinic(N,M)+NQ))O(T∗(N∗Dinic(N,M)+NQ))O(T*(N*Dinic(N,M)+NQ))。 【代码】 #include<bits/stdc++.h>using na...原创 2018-07-03 14:01:04 · 221 阅读 · 0 评论 -
【BZOJ4435】【Cerc2015】Juice Junctions
【题目链接】 点击打开链接 【思路要点】 建出GomoryHu-Tree ,剩余部分用DFS即可解决。 时间复杂度O(N∗Dinic(N,M)+N2)O(N∗Dinic(N,M)+N2)O(N*Dinic(N,M)+N^2),由于最大流至多为3,因此Dinic(N,M)=O(N+M)Dinic(N,M)=O(N+M)Dinic(N,M)=O(N+M)。 ...原创 2018-07-03 20:34:16 · 393 阅读 · 0 评论 -
【BZOJ2561】最小生成树
【题目链接】 点击打开链接 【思路要点】 比较显然的最小割,即删去最少的边,使得xxx和yyy通过小于和大于给定边边权的边都不连通。 时间复杂度O(Dinic(N,M))O(Dinic(N,M))O(Dinic(N,M))。 【代码】 #include<bits/stdc++.h>using namespace std;...原创 2018-07-04 20:48:52 · 360 阅读 · 0 评论 -
【BZOJ2521】【SHOI2010】最小生成树
【题目链接】 点击打开链接 【思路要点】 题目中的操作等价于对一条边权值加一。 问题转化为了,每条边有一个删去的代价,花费最少的代价,使得xxx和yyy通过除给定边以外小于等于给定边边权的边不连通。 最小割即可。 时间复杂度O(Dinic(N,M))O(Dinic(N,M))O(Dinic(N,M))。 【代码】 #includ...原创 2018-07-04 20:55:20 · 211 阅读 · 0 评论 -
【CodeForces】CodeForces Round #511 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Enlarge GCD【思路要点】令所有数的 gcdgcdgcd 为 ggg ,将所有数除去 ggg ,问题变为了所有数的 gcdgcdgcd 为 111 的情况。我们要选出一个最大的数集,使得这个数集中的数存在不为 111 的公因数。显然我们只需要考虑所有质数即可,线性筛求出每个数的最小质因子,质因...原创 2018-09-25 11:22:38 · 402 阅读 · 0 评论 -
【CodeForces】CodeForces Round #406 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Berzerk【思路要点】博弈搜索,将状态按先后手拆点,建出游戏图。若一个点存在出边指向必败态,则该点为必胜态。若一个点所有出边指向必胜态,则该点为必败态。不满足上述两点的点为平局态。用一个类似拓扑排序的过程实现即可。时间复杂度 O(N2)O(N^2)O(N2) 。【代码】#inclu...原创 2018-09-27 18:13:18 · 354 阅读 · 0 评论 -
【CodeForces】Mail.Ru Cup 2018 Round 1 (Div. 1 + Div. 2) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Elevator or Stairs?【思路要点】按照题意计算两种方式的用时,取较优的方案采纳。时间复杂度 O(1)O(1)O(1) 。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5 + 5...原创 2018-10-21 14:28:31 · 929 阅读 · 1 评论 -
【省内训练2018-12-23】Tree
【思路要点】显然有最小割的模型,建图时只需要判断树上两条路径是否有交即可。时间复杂度 O(NLogN+Dinic(M1+M2,M1∗M2))O(NLogN+Dinic(M_1+M_2,M_1*M_2))O(NLogN+Dinic(M1+M2,M1∗M2)) 。【代码】#include<bits/stdc++.h>using namespace std;co...原创 2018-12-23 17:16:30 · 286 阅读 · 0 评论 -
【UOJ77】A + B Problem
【题目链接】点击打开链接【思路要点】最小割,考虑在为每个元素 iii 在源汇之间建点 pointi,0point_{i,0}pointi,0 ,连边 (s,pointi,0,bi),(t,pointi,1,wi)(s,point_{i,0},b_i),(t,point_{i,1},w_i)(s,pointi,0,bi),(t,pointi,1,wi) ,此时的最小割即为...原创 2019-07-04 13:46:25 · 333 阅读 · 0 评论 -
【CodeForces】CodeForces Round #477 (Div. 1 + Div. 2) 题解
【比赛链接】Div. 1Div. 2【题解链接】点击打开链接【Div.2 A】Mind the Gap【思路要点】从小到大枚举答案,检查合法性。时间复杂度\(O(Ans*N)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 100005;template <typename T> vo...原创 2018-05-07 20:04:26 · 1694 阅读 · 1 评论 -
【BZOJ5032】【JSOI2014】病毒分类
【题目链接】点击打开链接【思路要点】显然,仅按照前缀/后缀对字符串的分类方式是唯一的,可以通过对字符串进行排序完成分类。考虑最小割,将每个点与源点间用前缀分类方式连边,与汇点间用后缀分类方式连边,运行最小割即可。通过最小割的割集可以轻松构造方案。BZOJ没有SPJ,无法正确评测本题,以下代码由笔者本人测试通过。时间复杂度\(O(NKLogN+Dinic(N,N))\)。【代码】#include&l...原创 2018-04-24 12:49:06 · 237 阅读 · 0 评论 -
【BZOJ1443】【JSOI2009】游戏Game
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 105#define MAXP 10005#define INF 1e9struct edge {int dest, flow; unsigned pos; };vector <edge> ...原创 2018-04-19 17:33:21 · 253 阅读 · 0 评论 -
【BZOJ1001】【BeiJing2006】狼抓兔子
【题目链接】点击打开链接【思路要点】直接运行\(Dinic\)算法即可,注意内存限制。本题使用\(std::vector\)离奇\(Runtime Error\),令笔者不解。本题也可以将最大流问题对偶为最小割,使用最短路算法求解,复杂度为\(O(N*MLogN*M)\)。【代码】#includeusing namesp原创 2018-01-12 10:10:18 · 373 阅读 · 0 评论 -
【BZOJ3144】【HNOI2013】切糕
【题目链接】点击打开链接【思路要点】若距离限制\(D≥N\),显然我们可以通过取每一条纵轴上的最小值求解,但我们也可以将每一条纵轴上的的权值首尾相连,形成一条有向链,将链首与链尾分别于源点和汇点用容量无穷的边相连,用最小割求解。现在考虑距离限制\(D\),若将相邻纵轴上距离恰好为\(D\)的点从较后者向较前者连一条容量无穷的边,在最小割问题中就表示不原创 2018-01-12 10:55:44 · 396 阅读 · 0 评论 -
【BZOJ1497】【NOI2006】最大获利
【题目链接】点击打开链接【思路要点】直接解最大权闭合子图问题即可。时间复杂度\(O(Dinic(N+M,N+3*M))\)。【代码】#includeusing namespace std;const int MAXP = 60005;const int INF = 1e9;template void read(T &原创 2018-01-15 09:45:00 · 329 阅读 · 0 评论 -
【BZOJ3438】小M的作物
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个种子,为了获得最大收益,我们显然一定要将它种下去。如果我们默认“选取”的意义是种在A田中,“不取”的意义是种在B田中,那么其“选取”得到的真正的权值为\(V_{a}-V_{b}\)。考虑增益条件,一个增益条原创 2018-01-15 10:46:58 · 399 阅读 · 0 评论 -
【BZOJ1565】【NOI2009】植物大战僵尸
【题目链接】点击打开链接【思路要点】题目中的限制可以总结为“若选取A,则必须选取B”,考虑最大权闭合子图问题。但是我们从样例中发现原图是可能存在环的,而最大权闭合子图问题要求原图是一个有向无环图。进一步分析发现,环上的元素是必然不能选取的,进而连向不能选的元素的元素同样不能选。进行一次DFS,确定每个元素是否可选,在可选的元素中建图,解最大权闭合子图原创 2018-01-15 09:01:59 · 436 阅读 · 0 评论 -
【BZOJ1458】士兵占领
【题目链接】点击打开链接【思路要点】矩阵可以看做一张二分图,其中行为左侧点,列为右侧点,矩阵中的元素为边。直观地考虑,我们发现本题可以用有上下界的网络流来实现。由源点向行\(i\)连边,下界为\(L_{i}\),上界为\(+\infty\)。由列\(i\)向汇点连边,下界为\(C_{i}\),上界为\(+\infty\)。若\((i,j)\)不是障碍原创 2018-01-15 12:54:01 · 312 阅读 · 1 评论 -
【BZOJ1711】【Usaco2007 Open】Dining
【题目链接】点击打开链接【思路要点】观察数据范围以及类似于容量限制的一列条件,考虑用最大流解题。一点对答案的贡献可以看做一个(食物、牛、饮料)的三元组,其中食物、牛、饮料中的每个元素仅能使用一次,且食物-牛和牛-饮料均可以根据给出的关系相互匹配。建立分层图,对中间的元素(牛)进行拆点限流,运行最大流即可。时间复杂度\(O(Dinic(2*N+F+D,原创 2018-01-16 08:48:08 · 315 阅读 · 0 评论 -
【BZOJ2127】Happiness
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个同学,如果我们默认“选取”的意义是选择文科,“不取”的意义是选择理科,那么其“选取”得到的真正的权值为\(V_{文科}-V_{理科}\)。考虑增益条件,一个增益条件可以拆分为两个形如“若某些元素选取,那原创 2018-01-16 10:21:35 · 329 阅读 · 0 评论 -
【BZOJ4873】【SHOI2017】寿司餐厅
【题目链接】点击打开链接【思路要点】挺裸的最大权闭合子图。若选取区间\([L,R](L<R)\),则必须选取区间\([L,R-1]\),\([L+1,R]\)。区间\([i,i]\)的权值应当减去\(a_i\),这里是考虑额外代价的\(cx\)部分。同时,选取任何一个或多个\(a_i=j\)的区间\([i,i]\),会额外付出\(m*j^2\)的代价,由区间\([i,i]\)向\(j\)连边...原创 2018-03-23 20:44:35 · 272 阅读 · 0 评论 -
【BZOJ3472】穿越
【题目链接】点击打开链接【思路要点】按时间拆点,然后网络流。时间复杂度\(O(Dinic(Ans*N,Ans*(N+M)))\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 105;const int MAXK = 1005;const int INF = 1e9;template <t...原创 2018-04-09 12:27:10 · 238 阅读 · 0 评论 -
【BZOJ5251】【2018多省省队联测】劈配
【题目链接】点击打开链接【思路要点】按照题意建图,跑网络流即可。由于\(C\)的限制,图中点数为\(O(N+M)\)级别,边数为\(O(N*C)\)级别的。并且,每一次运行Dinic算法只会增广一条路径,因此,时间复杂度为\(O(T*C*N^3)\)(\(N\)、\(M\)同阶)。【代码】#include<bits/stdc++.h>using namespace std;cons...原创 2018-04-09 11:34:35 · 610 阅读 · 0 评论 -
【BZOJ4857】【JSOI2016】反质数序列
【题目链接】点击打开链接【思路要点】首先,最终序列中至多有一个1,其余各数要么不选,要么全选。将数字按照奇偶性分类,和为质数的数对连边,那么将形成一张二分图。求解二分图的最大独立集即可。时间复杂度\(O(A_i+Dinic(N,N^2))\),并且实际上图中边数完全无法达到上界。【代码】#include<bits/stdc++.h>using namespace std;const...原创 2018-04-14 17:34:39 · 536 阅读 · 0 评论 -
【BZOJ4853】【JSOI2016】飞机调度
【题目链接】点击打开链接【思路要点】Floyd算法求出两点之间的最短路,然后最小路径覆盖。时间复杂度\(O(N^3+Dinic(M,M^2))\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 505;const int MAXP = 1005;const int INF = 1e9 + 10;...原创 2018-04-12 15:52:14 · 464 阅读 · 0 评论 -
【BZOJ4485】【JSOI2015】圈地
【题目链接】点击打开链接【思路要点】先默认每一栋房子都会卖出,卖给A的向源点连边,卖给B的向汇点连边,边权分别为房价的绝对值。相邻的房子连边,边权为围墙造价,用总房价减最小割即为答案。时间复杂度\(O(Dinic(N*M,N*M))\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 205;cons...原创 2018-04-18 14:39:33 · 473 阅读 · 1 评论 -
【BZOJ2437】【NOI2011】兔兔与蛋蛋
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 45#define MAXK 1005#define MAXP 1605#define INF 1e9struct edge {int dest, flow; unsigned pos; };vect...原创 2018-04-19 13:19:38 · 347 阅读 · 0 评论 -
【AtCoder】AtCoder Grand Contest 037 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】 Dividing a String【思路要点】设一个划分中第一次出现长度超过 222 的 SiS_iSi 的位置为 iii 。则可以通过将 SiS_iSi 划分为更小的串,以及将 SiS_iSi 的某一个后缀拼接至 Si+1S_{i+1}Si+1 的方式使得第一次出现长度超过 222 的 SiS_iS...原创 2019-08-19 11:14:41 · 855 阅读 · 0 评论