
网络流
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
Codeforces - Strange Set
题目链接:Codeforces - Strange Set不难看出是一个最大权闭合子图。但是我们考虑优化连边,显然每个点对于同一种权值来说,只会连前面最近的。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=3原创 2021-01-16 18:55:17 · 318 阅读 · 4 评论 -
Codeforces - Yet Another DAG Problem
题目链接:Codeforces - Yet Another DAG Problem因为每个边有一个权值为 (a[u] - a[v])*w,于是我们可以把边拆开,看每个点的贡献。我们可以发现我们对每个点设置 0 -> n-1 的权值一定可以达到最小值。然后对每个点可以建立一个类似于分层图的东西,每条边代表 0 ,1,2,。。。然后对于每个点是否选取也就是这条边是否割掉。然后对于DAG上面的权值大小影响,我们可以对 v 的权值小的点,连向 u 的权值大的点,流量为 INF ,这样就能保证最小割原创 2020-11-29 22:01:25 · 348 阅读 · 0 评论 -
[TJOI2018]智力竞赛
题目链接:[TJOI2018]智力竞赛首先我们可以想到二分。然后对于需要覆盖的点,看是否被小于等于 n+1 条链全部覆盖,先跑一个传递闭包,然后把小于等于二分的点拿出来建图即可。然后就是一个最小链覆盖了。如果不跑传递闭包,单独对 x+m -> x的边,我们无法处理 3 -> 5 -> 4 ,但是我们二分的答案为4的情况。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc原创 2020-10-15 14:48:57 · 248 阅读 · 0 评论 -
Codeforces - Buying Sets
题目链接:Codeforces - Buying Sets如果不考虑 k 的限制,那么就是一个最小权闭合子图。然后现在需要相等,所以我们给集合一个正的权值,元素一个负的权值,保证可以相等。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int inf=0x3f3f3f3f3f原创 2020-08-31 17:45:48 · 282 阅读 · 0 评论 -
[JSOI2009]球队收益
题目链接:[JSOI2009]球队收益因为要限制每个比赛,一胜一负,流量无法限制。所以我们可以假设先全败,然后选择某个人获胜,然后用差值来改变。假设当前a胜,b负。然后获胜一次的差值为:c*(a+1)*(a+1) + d*(b-1)*(b-1) - c*a*a - d*b*b= c*(2*a+1) - d*(2*b-1)AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h&g原创 2020-08-25 00:19:51 · 150 阅读 · 0 评论 -
HDU - 5352
题目链接:HDU - 5352按照每次的变换建边即可。因为要求最小字典序,所以我们可以用费用流的权值来限制。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=1e3+10,M=1e6+10;int n,m,k,原创 2020-08-20 22:59:33 · 163 阅读 · 0 评论 -
乔乔和牛牛逛超市
题目链接:乔乔和牛牛逛超市因为一个物品是有两种状态的。A,B。买了A才能在买A的基础上买B。我们可以把费用拆成两种。第一个为f(A),第二个为f(B)-f(A)。这样的话买两个的时候就不会多算了。然后按照最大权闭合子图建图即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;cons原创 2020-08-18 23:19:47 · 1360 阅读 · 0 评论 -
HDU - 6437
题目链接:HDU - 6437其他博客中基本上都是O(n+m*m)复杂度的连边。但是其实可以优化到O(n+m)我们对每种种类,分别看成两层图,然后第一种是第一类的,第二层是第二类的。如果选择某个节目,那么看完之后连向本身的下一个点则 -W 的费用,否则连向另一层点为 0 的费用。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long lon原创 2020-07-31 21:39:38 · 265 阅读 · 0 评论 -
Roads
题目链接:Roads容易发现,答案就是有可能出现在MST上面的边,然后使其不在同一个联通块中的最小切边数。所以我们把所有可能出现在MST上面的边全部加进来,求一个全局最小割,StoerWagner即可。判断边是否可能在MST上面出现,我们先对边排序,对于相同权值的点一起看,只要当前这两个端点未被连通则可以出现。各种倍增判断当然也是ok的,只是比较麻烦。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bi原创 2020-07-24 14:44:49 · 321 阅读 · 0 评论 -
Codeforces - Array and Operations
题目链接:Codeforces - Array and Operations很显然的二分图。只不过建图麻烦,其实也不是很麻烦,暴力搞就行。把因子单独拿出来建图。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=原创 2020-07-04 18:24:06 · 267 阅读 · 0 评论 -
Lotus Leaves
题目链接:Lotus Leaves显然是一个最小割模型。但是我们暴力连边是O(n ^ 3)的。考虑优化:我们可以把每一条竖着的,横着的抽出来,然后就变成O(n ^ 2)了。没什么难度。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;原创 2020-06-27 10:45:22 · 383 阅读 · 0 评论 -
Delight for a Cat
题目链接:Delight for a Cat我们首先把全部都看成睡觉,那么对于玩游戏的费用就是 b[i]-a[i] ,然后每个区间玩游戏选择的个数就是已知的。然后我们可以发现,这个是一个线性规划的形式,由于要输出具体方案,所以不能单纯性,需要用网络流来做。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespac原创 2020-06-16 16:19:00 · 343 阅读 · 0 评论 -
HDU - 4560
题目链接:HDU - 4560显然可以二分最大次数。然后因为把歌曲分为喜欢点和不喜欢点,不喜欢点到汇点T限制流量为K即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=410,M=1e6+10;int t原创 2020-06-16 10:22:57 · 165 阅读 · 0 评论 -
Codeforces - ALT
题目链接:Codeforces - ALT显然我们可以发现一个最小割建图:S到每个人流量为1,每个人到经过的所有守卫流量为INF,守卫到T流量为1。答案就是最大流。但是连边复杂度是n*n的,所以我们需要树剖+线段树优化。最后输出方案的时候先流量染色即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing name原创 2020-05-28 20:50:59 · 209 阅读 · 0 评论 -
HDU - 4322
题目链接:HDU - 4322因为不喜欢造成的都是一样的,所以我们其实是让喜欢的代价尽量多。然后每个人向汇点连边流量为b/k,费用为k但是可能某个人拿糖之后会超过本身的B就变得不优了。但是也可能会继续拿喜欢的糖果(当糖果剩余时),所以当b不能整除k的时候,加一个到汇点流量为1,费用为b%k的边。最后看剩下用1的糖果是否满足即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h&原创 2020-05-25 22:43:10 · 225 阅读 · 0 评论 -
迷宫
题目链接:迷宫显然可以二分时间。然后我们建立mid层分层图,然后最大流即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=1e5+10,M=2e6+10;int n,m,num,s,t,h[N],ss,t原创 2020-05-23 09:43:49 · 133 阅读 · 0 评论 -
Magic Potion
题目链接:Magic Potion比较弱智的网络流,最开始源点到每个英雄流量为1,很显然。现在有一个药水,所以加一个源点到药水流量为k,药水到英雄流量为1即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=原创 2020-05-18 19:40:01 · 275 阅读 · 0 评论 -
座位安排
题目链接:座位安排显然随便网络流或者匈牙利做一做即可。如果是匈牙利的话,把一排的两个点拆开,网络流直接流量为2即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f3f;const int N=1e4+10,M=1e6+10;int n原创 2020-05-14 11:27:09 · 394 阅读 · 0 评论 -
[加油武汉]疫情调查
题目链接:[加油武汉]疫情调查显然是一个最小环覆盖。就是权值最小的环覆盖所有点。然后因为环可相交,并且可以成自环。所以对于第一个添加:出点到入点流量为INF,费用为0的边。保证每次都是最短路。对于自环:添加 i -> i+n ,流量为INF,费用为a[i]的边即可。和DAG图上,可交路径覆盖类似。AC代码:#pragma GCC optimize("-Ofast","-f...原创 2020-04-30 16:08:37 · 195 阅读 · 0 评论 -
科大讯飞杯 动物森友会
题目链接:科大讯飞杯 动物森友会显然时间可以二分。然后就找到每个星期的操作次数。然后最大流即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int inf=0x...原创 2020-04-18 16:55:05 · 309 阅读 · 0 评论 -
报纸
题目链接:报纸考虑怎么求最多一次性覆盖两个的个数。然后剩下的直接暴力覆盖。首先黑白染色,然后相邻的相连,最大流即为覆盖最多的两个的个数。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace...原创 2020-04-11 20:42:18 · 201 阅读 · 0 评论 -
Matrix Decompressing
题目链接:Matrix Decompressing根据前缀和,我们可以找到每一行每一列的值。每个数字的大小都有限制,所以我们直接按照行列建图,跑上下界最大流即可。但是其实,我们先让每个点的值都减一,然后最大流即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>...原创 2020-03-31 18:36:52 · 257 阅读 · 0 评论 -
[TJOI2007]脱险
题目链接:[TJOI2007]脱险因为同一时间,只能出去一个人,所以我们直接按照时间分层,每一个时间段,同一个门的流量为1,只能出去一个即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespa...原创 2020-03-28 16:23:50 · 248 阅读 · 0 评论 -
HDU - 5406
题目链接:HDU - 5406比较经典的费用流了。但是直接暴力连边是会TLE的,queue可以改成stack能AC。但是可以优化一些连边,比如 A->B , B->C ,A->C,这种,A->C的边就没有必要了。我们可以通过B->C流过来,但是是不要费用的,所以拆点之后存在两边,一个费用为1,一个无费用为中转点。AC代码:#pragma GCC opt...原创 2020-03-11 18:41:03 · 214 阅读 · 0 评论 -
HDU - 3820
题目链接:HDU - 3820首先,网格图中的相邻关系,我们不难想到二分图。我们拆点,点的含义分别为金和银。然后对于(i+j)为奇数的点,我们让S连向金点,否则S连向银点。那么对于相邻的点,金到金流量为G,银到银流量为S。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++....原创 2020-03-11 16:43:07 · 185 阅读 · 0 评论 -
Codeforces - Binary Tree on Plane
题目链接:Codeforces - Binary Tree on Plane什么是二叉树呢?我们需要限制每个点一个父亲(除开根节点),每个点最多两个儿子。然后我们拆点:S到每个点的出点,流量为2,保证最多两个儿子。每个点的入点到T,流量为1,保证每个点一个父亲。对于能到更小的y值,流量为1,费用为两点之间的距离。最后MCMF即可。AC代码:#pragma GCC optimiz...原创 2020-03-09 21:09:12 · 254 阅读 · 0 评论 -
Codeforces - Gang Up
题目链接:Codeforces - Gang Up因为有停留这个东西,所以我们可以按照时间分层。然后分层图上最小费用流即可。应该比较简单,直接看代码吧。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing ...原创 2020-03-09 15:21:33 · 221 阅读 · 0 评论 -
Codeforces - Underfail
题目链接:Codeforces - Underfail其实就是一个区间覆盖问题,每个点限制了覆盖的次数。然后从S流出去的流量为x即可。对一个区间连边的时候,应该是 l->r+1 注意。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define i...原创 2020-03-09 11:22:36 · 307 阅读 · 0 评论 -
Codeforces - Four Melodies
题目链接:Codeforces - Four Melodies显然,暴力连边是 n*n 的,肯定会TLE。考虑优化:我们考虑对%7的值分块,那么同一个块中前面的点可以到后面的所有点,那么我们每个点就只需要连后面的满足的点了。怎么满足同一个块中前面的可以到后面呢?我们加一条 i->i+n流量为INF,费用为0的边即可。AC代码:#pragma GCC optimize("-Ofa...原创 2020-03-08 14:12:19 · 216 阅读 · 0 评论 -
Codeforces - Build String
题目链接:Codeforces - Build String比较水的费用流,直接按照字母建图即可。存在某个字母就连边。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;cons...原创 2020-03-08 10:50:44 · 210 阅读 · 0 评论 -
80人环游世界
题目链接:80人环游世界显然可以直接上下界最小费用可行流。但是其实,我们可以通过流量的极小值来保证,一定走这条边的限制。我为了方便,直接写的上下界。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing na...原创 2020-03-07 10:22:51 · 229 阅读 · 0 评论 -
土地划分
题目链接:土地划分考虑最小割分割。然后我们可以列出5个未知数,4个方程。然后根据对称性消去方程即可得到最后的解。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const...原创 2020-03-06 19:00:55 · 583 阅读 · 0 评论 -
学习小组
题目链接:学习小组水题,把每条到T的边,拆成n条即可处理平方费用。但是要注意,是参加的人最多,而不是人参加的小组最多,所以还需要从人到T连流量为k-1的边。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing...原创 2020-03-06 17:46:06 · 213 阅读 · 0 评论 -
2012 ACM-ICPC Asia Hatyai - Binary Matrix 2
题目链接:2012 ACM-ICPC Asia Hatyai - Binary Matrix 2显然,我们很难限制每一行每一列都相等这个条件。但是如果我们枚举每一行,每一列的个数,复杂度太高。但是我们可以注意到,我们枚举一行的时候,列的个数是已经确定了的。我们按照行列建图。然后对于原本有的边我们流量为1,费用为0。原本没有的边,流量为1,费用为1。但是现在无法解决1->0的情况...原创 2020-03-06 13:01:56 · 376 阅读 · 0 评论 -
Codeforces - Card Game
题目链接:Codeforces - Card Game显然等级可以二分。所以我们可以二分处理掉一维的数据。然后对于这种素数问题,我们可以建立二分图。奇偶二分图。因为只有可能奇数和偶数组成为素数。但是这道题要注意,如果有多个1,我也只能取一个,取最大的即可。然后就是最小割模型了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loo...原创 2020-03-02 10:05:46 · 329 阅读 · 0 评论 -
Cops And Roobers
题目链接:Cops And Roobers直接建图,拆点最小割就好了,没什么难度。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int inf=0x3f3f3f...原创 2020-03-01 10:45:31 · 331 阅读 · 0 评论 -
[CEOI2008]order
题目链接:[CEOI2008]order一眼看去,很像闭合子图。但是多了一个租的东西。这个其实就是多了一种决策。(所以我们可以决策单调优化dp(逃))所以我们把原本闭合子图的INF边,变为租机器的费用即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#...原创 2020-02-27 17:24:22 · 212 阅读 · 0 评论 -
[AHOI2014/JSOI2014]支线剧情
题目链接:[AHOI2014/JSOI2014]支线剧情显然每条边必须经过一次,可以用流量的下界来限制。所以直接最小费用可行流即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace s...原创 2020-02-27 14:33:34 · 164 阅读 · 0 评论 -
[TJOI2010]电影迷
题目链接:[TJOI2010]电影迷水题,因为有负权,总体加个正值即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=110,M=1e6+10;c...原创 2020-02-27 12:34:03 · 302 阅读 · 0 评论 -
[SDOI2017]新生舞会
题目链接:[SDOI2017]新生舞会显然 分数规划+费用流。这道题比较卡精度,比较大小的时候不能加eps,直接比较,比较是否相等时需要eps。AC代码:#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=110,M=1e6+10;const int inf=0x...原创 2020-02-27 12:02:41 · 539 阅读 · 2 评论