
【算法】线性规划与网络流
文章平均质量分 72
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【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 评论 -
【BZOJ1877】【SDOI2009】晨跑
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 505#define INF 1e9#define MAXQ 1000005template <typename T> void read(T &x) { x = 0; int f ...原创 2018-06-20 15:18:17 · 287 阅读 · 0 评论 -
【LOJ2321】「清华集训 2017」无限之环
【题目链接】 点击打开链接 【思路要点】 先说这道题的正解: 将棋盘看做一张二分图,每一条边拆成两个点,分别属于二分图的一边。 我们需要做一件类似于匹配的事情,同一条边的两侧或是都没有管道,或是都有管道。 通过合适的建边我们能够用最小费用最大流来解决本题。 时间复杂度O(MinCostFlow(N∗M,N∗M))O(MinCostFlow(N∗...原创 2018-06-26 21:09:16 · 524 阅读 · 0 评论 -
【BZOJ3502】【PA2012】Tanie linie
【题目链接】 点击打开链接 【思路要点】 容易发现一种可行的费用流建边。 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。 时间复杂度O(MLogN)O(MLogN)O(MLogN)。 【代码】 #include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;#define...原创 2018-06-26 17:51:07 · 315 阅读 · 0 评论 -
【BZOJ2288】【POJ Challenge】生日礼物
【题目链接】 点击打开链接 【思路要点】 容易发现一种可行的费用流建边。 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。 时间复杂度O(MLogN)O(MLogN)O(MLogN)。 【代码】 #include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;#define...原创 2018-06-26 17:49:24 · 636 阅读 · 0 评论 -
【BZOJ3267】KC采花
【题目链接】 点击打开链接 【思路要点】 容易发现一种可行的费用流建边。 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。 时间复杂度O(MKLogN)O(MKLogN)O(MKLogN)。 【代码】 #include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;#def...原创 2018-06-26 17:46:30 · 290 阅读 · 0 评论 -
【BZOJ3272】Zgg吃东西
【题目链接】 点击打开链接 【思路要点】 容易发现一种可行的费用流建边。 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。 时间复杂度O(MKLogN)O(MKLogN)O(MKLogN)。 【代码】 #include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#def...原创 2018-06-26 17:44:26 · 443 阅读 · 0 评论 -
【BZOJ3638】k-Maximum Subsequence Sum
【题目链接】 点击打开链接 【思路要点】 容易发现一种可行的费用流建边。 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。 时间复杂度O(MKLogN)O(MKLogN)O(MKLogN)。 【代码】 #include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#def...原创 2018-06-26 17:41:15 · 502 阅读 · 0 评论 -
【BZOJ1070】【SCOI2007】修车
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 105#define MAXP 1005#define MAXQ 1000005#define INF 1e9template <typename T> void read(T &x...原创 2018-06-07 19:58:37 · 247 阅读 · 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 评论 -
【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 评论 -
【BZOJ4514】【SDOI2016】数字配对
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 505#define INF 1e18#define MAXQ 1000005template <typename T> void read(T &x) { x = 0; int f...原创 2018-06-20 20:58:13 · 228 阅读 · 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 评论 -
【校内训练2019-07-08】串
【思路要点】将一组 S2[i],T2[i]S_2[i],T_2[i]S2[i],T2[i] 看做一条边 T2[i]→S2[i]T_2[i]\rightarrow S_2[i]T2[i]→S2[i] ,则使得 S1[i]S_1[i]S1[i] 成为 T1[i]T_1[i]T1[i] 的交换过程对应了一条 S1[i]S_1[i]S1[i] 到 T1[i]T_1[i]T1[i] 的...原创 2019-07-08 13:57:18 · 403 阅读 · 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 评论 -
【AtCoder】AtCoder Grand Contest 034 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】 Kenken Race【思路要点】首先, AAA 到 CCC 中与 BBB 到 DDD 中不能存在连续的两个障碍物。其次,若 D<CD<CD<C ,需要额外满足 BBB 到 DDD 中存在至少一个空位两侧均为空位。时间复杂度 O(N)O(N)O(N) 。【代码】#...原创 2019-06-03 09:43:54 · 827 阅读 · 0 评论 -
【省内训练2019-06-01】颁奖
【思路要点】较为简单的模拟费用流问题。可以参考 WC2019WC2019WC2019 第一课堂陈江伦的《模拟费用流问题》课件。时间复杂度 O(NLogN)O(NLogN)O(NLogN) 。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5 + 5;const long lon...原创 2019-06-05 12:51:36 · 467 阅读 · 0 评论 -
【省内训练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 评论 -
【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 评论 -
【CodeForces】CodeForces Round #406 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Berzerk【思路要点】博弈搜索,将状态按先后手拆点,建出游戏图。若一个点存在出边指向必败态,则该点为必胜态。若一个点所有出边指向必胜态,则该点为必败态。不满足上述两点的点为平局态。用一个类似拓扑排序的过程实现即可。时间复杂度 O(N2)O(N^2)O(N2) 。【代码】#inclu...原创 2018-09-27 18:13:18 · 354 阅读 · 0 评论 -
【省内训练2018-09-15】Flow
【思路要点】 为每条边附加一个 111 的费用,问题等价于原图上的最大费用循环流。 不妨假设所有边都已经流满,将所有边反向,记 didid_i 表示原图中点 iii 出度减入度的差,若 didid_i 大于 000 ,则将 iii 连向汇点,容量为 didid_i ,否则将源点连向 iii ,容量为 −di−di-d_i 。 新图上的最小费用最大流的费用就代表了为了保证流量平...原创 2018-09-17 08:42:02 · 247 阅读 · 0 评论 -
【BZOJ1927】【SDOI2010】星际竞速
【题目链接】 点击打开链接 【思路要点】 补档博客,无题解。 【代码】 #include<bits/stdc++.h>using namespace std;#define MAXN 5005#define MAXQ 1000005#define INF 1e9template <typen...原创 2018-07-12 16:53:35 · 229 阅读 · 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 评论 -
【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 评论 -
【BZOJ2661】连连看
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 1005#define INF 1e9#define MAXQ 1000005template <typename T> void read(T &x) { x = 0; int f...原创 2018-06-20 19:45:22 · 285 阅读 · 0 评论 -
【BZOJ5335】【TJOI2018】智力竞赛
【题目链接】点击打开链接【思路要点】二分答案,然后用有上下界的最小流验证答案。时间复杂度\(O(LogM*Dinic(M,\sum K_i))\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 505;const int MAXP = 2005;const int INF = 1e9;templ...原创 2018-06-12 11:16:00 · 498 阅读 · 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 评论 -
【BZOJ2597】【WC2007】剪刀石头布
【题目链接】点击打开链接【思路要点】数据范围暗示网络流/线性规划,但直接建图不太可行,需要发掘题目性质。考虑一个原图三个点的子图,它共有3条边,\(2^{3}=8\)种形式,其中能对答案产生1的贡献的有2种。观察剩余6种形式,我们发现,它们都满足三个端点处分别是一入一出、两入、两出。如果我们把出现一次这6种形式之一看做对答案造成1点损失,那么把损失归原创 2018-01-17 10:05:55 · 350 阅读 · 0 评论 -
【BZOJ2127】Happiness
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个同学,如果我们默认“选取”的意义是选择文科,“不取”的意义是选择理科,那么其“选取”得到的真正的权值为\(V_{文科}-V_{理科}\)。考虑增益条件,一个增益条件可以拆分为两个形如“若某些元素选取,那原创 2018-01-16 10:21:35 · 329 阅读 · 0 评论 -
【BZOJ1711】【Usaco2007 Open】Dining
【题目链接】点击打开链接【思路要点】观察数据范围以及类似于容量限制的一列条件,考虑用最大流解题。一点对答案的贡献可以看做一个(食物、牛、饮料)的三元组,其中食物、牛、饮料中的每个元素仅能使用一次,且食物-牛和牛-饮料均可以根据给出的关系相互匹配。建立分层图,对中间的元素(牛)进行拆点限流,运行最大流即可。时间复杂度\(O(Dinic(2*N+F+D,原创 2018-01-16 08:48:08 · 315 阅读 · 0 评论 -
【BZOJ1458】士兵占领
【题目链接】点击打开链接【思路要点】矩阵可以看做一张二分图,其中行为左侧点,列为右侧点,矩阵中的元素为边。直观地考虑,我们发现本题可以用有上下界的网络流来实现。由源点向行\(i\)连边,下界为\(L_{i}\),上界为\(+\infty\)。由列\(i\)向汇点连边,下界为\(C_{i}\),上界为\(+\infty\)。若\((i,j)\)不是障碍原创 2018-01-15 12:54:01 · 312 阅读 · 1 评论 -
【BZOJ1565】【NOI2009】植物大战僵尸
【题目链接】点击打开链接【思路要点】题目中的限制可以总结为“若选取A,则必须选取B”,考虑最大权闭合子图问题。但是我们从样例中发现原图是可能存在环的,而最大权闭合子图问题要求原图是一个有向无环图。进一步分析发现,环上的元素是必然不能选取的,进而连向不能选的元素的元素同样不能选。进行一次DFS,确定每个元素是否可选,在可选的元素中建图,解最大权闭合子图原创 2018-01-15 09:01:59 · 436 阅读 · 0 评论 -
【BZOJ3438】小M的作物
【题目链接】点击打开链接【思路要点】题目中的一类增益可以归结为“若某些元素的选取状态为0/1,那么额外获得收益”,考虑最大权闭合子图问题。对于一个种子,为了获得最大收益,我们显然一定要将它种下去。如果我们默认“选取”的意义是种在A田中,“不取”的意义是种在B田中,那么其“选取”得到的真正的权值为\(V_{a}-V_{b}\)。考虑增益条件,一个增益条原创 2018-01-15 10:46:58 · 399 阅读 · 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 评论 -
【BZOJ3144】【HNOI2013】切糕
【题目链接】点击打开链接【思路要点】若距离限制\(D≥N\),显然我们可以通过取每一条纵轴上的最小值求解,但我们也可以将每一条纵轴上的的权值首尾相连,形成一条有向链,将链首与链尾分别于源点和汇点用容量无穷的边相连,用最小割求解。现在考虑距离限制\(D\),若将相邻纵轴上距离恰好为\(D\)的点从较后者向较前者连一条容量无穷的边,在最小割问题中就表示不原创 2018-01-12 10:55:44 · 396 阅读 · 0 评论 -
【BZOJ1001】【BeiJing2006】狼抓兔子
【题目链接】点击打开链接【思路要点】直接运行\(Dinic\)算法即可,注意内存限制。本题使用\(std::vector\)离奇\(Runtime Error\),令笔者不解。本题也可以将最大流问题对偶为最小割,使用最短路算法求解,复杂度为\(O(N*MLogN*M)\)。【代码】#includeusing namesp原创 2018-01-12 10:10:18 · 373 阅读 · 0 评论 -
【BZOJ1189】【HNOI2007】紧急疏散evacuate
【题目链接】点击打开链接【思路要点】问题中存在一种类似于流量限制的人流限制,考虑用网络流解决本题。枚举答案,对于每个时刻的每个位置分别建立一个点,简单建图后运行最大流,观察是否满流即可。常见的网络流\(Dinic\)算法中建立了反向边,因此可以在\(Ans=x\)的残量网络上加点后直接继续运行\(Ans=x+1\)的结果。最终图中的点数与边数均为\(原创 2018-01-12 09:54:57 · 469 阅读 · 0 评论 -
【CodeForces605C】Freelancer's Dreams
【题目链接】点击打开链接【思路要点】显然有如下线性规划:$$ \left\{\begin{aligned}Minimize\quad \sum_{i=1}^{N}x_i\\Constraints\quad \sum_{i=1}^{N}a_ix_i≥p \\Constraints\quad \sum_{i=1}^{N}b_ix_i≥q\end{aligned}\right.$$其对偶问题为:$$ \...原创 2018-03-31 16:41:49 · 429 阅读 · 0 评论