网络流
文章平均质量分 81
毒瘤
ez_lcw
这个作者很懒,什么都没留下…
展开
-
【CF802O】April Fools‘ Problem (hard)(wqs二分,模拟费用流,老鼠进洞)
如果没有恰好为 kkk 的限制的话是个老鼠进洞的经典模型。加上恰好为 kkk 的限制后考虑使用 wqs 二分,因为费用流每次增广出来的费用是单调不降的。即如果设 g(k)g(k)g(k) 表示总流量恰好为 kkk 的最小花费,那么必有 g(k)−g(k−1)≤g(k+1)−g(k)g(k)-g(k-1)\le g(k+1)-g(k)g(k)−g(k−1)≤g(k+1)−g(k),且 (k,g(k))(k,g(k))(k,g(k)) 这些点构成一个凸壳。wqs 二分的大概思路是:首先要求在没有 kkk 的原创 2021-12-16 11:48:55 · 364 阅读 · 0 评论 -
【XSY3396】地铁(平面图与对偶图,最小割)
题意:给一张平面图,满足这张平面图的对偶图是一棵树,有若干限制,形如 “若经过点 xxx 则必须要经过点 yyy”,求 1∼n1\sim n1∼n 的最短路。由于平面图与其对偶图互为对偶,所以平面图最短路等于其对偶图上的最小割。注意这里的最小割和普通的最小割有点不一样,这里要求任意一条 S→TS\to TS→T 的路径上都只有一条割边(不然就不能对应平面图上的一条最短路),于是我们在求最小割时要给每条边加上容量为 INF 的反边。例:假设对偶图左图长这样(尽管这不是一棵树),那么我们的最小割算原创 2021-10-08 18:37:21 · 226 阅读 · 0 评论 -
【XSY3899】切割(思维,模拟二分图匹配)
考虑这么一个边都和坐标轴平行的不规则图形,经过水平或竖直切割后,如何判断切割后的图形是个矩形。容易发现,如果切出来后的图形没有凹进去的点,它就是一个矩形。那么假设一开始有 aoaoao 个凹点,那么你的目标就是让凹点的个数变为 000。然后对于一种切法,如果它不经过凹点,我们肯定可以调整这种切法使得它经过凹点,可以证明这样不会更劣。那么你只需要最多切 aoaoao 次就可以把这个不规则图形切成一些矩形了。现在你的目标是每一次切尽量减少多一点凹点,也就是说尽量让每一切都能切到两个凹点。我们考虑在原原创 2021-03-23 19:36:46 · 126 阅读 · 0 评论 -
【XSY3890】【hdu5263】平衡大师(二分,上下界网络流)
不妨令 k=m−kk=m-kk=m−k,那么题目的意思就是至多删去 kkk 条边。首先二分答案 ttt,然后求最少需要删去多少的边,如果最少需要删去的边 ≤k\leq k≤k 则合法。在原图中统计每一个点的入度-出度,记为 dud_udu。首先对于每一条边 (u,v)(u,v)(u,v),从 uuu 向 vvv 连边 ([0,1],1)\big([0,1],1\big)([0,1],1)(小括号内前一位表示容量上下界,后一位表示费用),表示删去这条边需要耗费 111。对于每一个点 uuu,分三种情原创 2021-02-08 10:26:40 · 122 阅读 · 0 评论 -
【JSOI2016】反质数序列(二分图,最小割)
这都能扯到二分图上,看来是我做题太少了。不是质数的情况有很多种,不妨考虑一下包含质数的情况。考虑到质数只有可能是奇数+偶数构成的(222 除外,不过 222 只能由 1+11+11+1 凑成,所以我们考虑时只考虑一个 111,其余的 111 全部不选),所以不妨将所有的数按奇偶分类,构成一个二分图。然后如果两个数加起来是一个质数,我们就将它们连边。现在的要求是删除一些点以及与它们相连的边,使得图上不剩下边,这个用最小割解决就行了。听说这个叫二分图最大独立集(#include<bits/st原创 2021-02-07 22:02:30 · 127 阅读 · 0 评论 -
【AGC031E】Snuke the Phantom Thief(费用流)
先假设只有一维的情况。考虑枚举偷的珠宝的个数 kkk,且假设它们按照坐标大小排好了序。那么可以将条件转化一下,大于等于 aia_iai 的最多取 bib_ibi 个可以转化为取的前 k−bik-b_ik−bi 个珠宝的坐标要小于 aia_iai。同理,小于等于 aia_iai 的最多可以取 bib_ibi 个可以转化为取的后 k−bik-b_ik−bi 个珠宝的坐标要大于 aia_iai。那么这样的话,就可以计算出取的每个珠宝坐标的取值范围 [l,r][l,r][l,r]。二维同理原创 2021-02-07 19:07:34 · 282 阅读 · 0 评论 -
【ARC080F】Prime Flip(二分图匹配,差分)
这种区间反转的题,套路就是差分。设 aia_iai 表示第 iii 枚硬币是否正面朝上,显然只有 ax1,ax2,⋯ ,axna_{x_1},a_{x_2},\cdots,a_{x_n}ax1,ax2,⋯,axn 等于 111,其他都是 000。那么我们的目标是把 aaa 数组全部变成 000。设 bib_ibi 表示第 iii 枚硬币和第 i−1i-1i−1 枚硬币是否不同,即 bi=aixorai−1b_i=a_i\operatorname{xor} a_{i-1}bi=aix原创 2020-10-17 16:34:04 · 129 阅读 · 1 评论 -
【ARC074F】Lotus Leaves(最小割)
遇到这种整列整行的题可以考虑用一个节点表示整一列或者建一个虚拟节点向这一列的每个点连边。然后最小割的定义:把所有节点分到分别包含 SSS 和 TTT 的两个集合内,求 SSS 所在集合指向 TTT 所在集合的所有边的边权和的最小值。也就是割成两半的最小代价,这个可以联想到:图论,把图分成两半的最小代价。很多人做选择,做完选择的最小代价。这道题就是联想到了第 111 点。代码如下:#include<bits/stdc++.h>#define N 110#define原创 2020-10-03 16:47:18 · 171 阅读 · 0 评论 -
【BZOJ2502】清理雪道(最大费用最大流)
上下界网络流的做法大佬们都讲过了,我就来讲一个另类的解法。(不过也是网络流)这个做法是考场上想了很久都不会后奇思妙想想出来的(不会上下界网络流),所以没多少思路引导。首先原题明显可以转移成一个类似最小链覆盖的问题。剩下的就是我的具体做法:我们对原来的有向无环图进行改造:上面的是原图,我们把图中的每一条边 eie_iei 拆成两条边:一条流量为 111,费用为 111,不妨取名叫 aia_iai;一条流量为 ∞\infty∞,费用为 000,取名叫 bib_ibi。然后源点向每个入度为 00原创 2020-08-11 14:03:17 · 137 阅读 · 0 评论 -
【BZOJ4205】卡牌配对(网络流)
Description现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C。把卡牌分为X,Y两类,分别有n1,n2张。两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不同。比如一张X类卡牌属性值分别是225,233,101,一张Y类卡牌属性值分别为115,466,99。那么这两张牌是可以配对的,因为只有101和99一组属性互质。游戏的目的是最大化匹配上的卡牌组数,当然每张卡牌只能用一次。Input数据第一行两个数n1,n2,空格分割。接下来n1行,每.原创 2020-07-28 21:06:46 · 258 阅读 · 0 评论 -
【SHOI2010】最小生成树(最小割,最小生成树)
初看题目,发现题目的操作比较复杂。仔细想了一想,发现题目中的操作“把图中除了这条边以外的边,每一条的权值都减少 111”就等价于“把这条边的权值加 111”。所以题目的操作就被我们化繁为简了。然后继续想:如何才能使 LabLabLab 边一定在最小生成树中?画个图看一下(就以样例为例):假设现在 LabLabLab 边是 (1,2)(1,2)(1,2),长度为 222。那么既然我要保证 LabLabLab 边是最小生成树的一条边,点 111、222 就不能在一个环里面,也就是说,点 111、222原创 2020-07-20 14:32:56 · 396 阅读 · 0 评论 -
【BZOJ3218】a + b Problem(网络流)
思路跟 happiness 差不多,只不过需要用主席树优化一下建图。#include<bits/stdc++.h>#define N 5010#define INF 0x7fffffffusing namespace std;int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') {原创 2020-06-06 10:36:40 · 153 阅读 · 0 评论 -
【BZOJ2127】happiness(网络流)
建模:首先 SSS 向每一个 (i,j)(i,j)(i,j) 连一条它选文科的价值的边,每一个 (i,j)(i,j)(i,j) 向 TTT 连一条它选理科的价值的边。然后对于两个点 a,ba,ba,b,假设他们同时选理科能获得价值 xxx,那么新建一个节点 newnodenewnodenewnode,连 (S,newnode,x)(S,newnode,x)(S,newnode,x),(newnode,a,inf)(newnode,a,\inf)(newnode,a,inf),(newnode,b,in原创 2020-06-06 10:34:20 · 148 阅读 · 0 评论 -
【SDOI2015】星际战争(网络流)
由于时间可能是小数,所以不能直接跑。先二分答案为 ttt。SSS 向每个激光武器 iii 连一条容量为 bi×tb_i\times tbi×t 的边,表示这个激光武器最多能输出多少。然后每个机器人向 TTT 连一条容量为 aia_iai 的边,表示这个机器人至少需要这么多攻击才能被摧毁。接着每个激光武器向每个它能攻击的机器人连一条容量为 inf\infinf 的边。然后跑最大流看流量等不等于所有机器人的血量之和。因为时间是小数,所以二分的时候时间和机器人血量先乘上个 10310^3103,原创 2020-06-06 09:51:41 · 141 阅读 · 0 评论