给一棵带点权边权的树,支持加点权,询问带权重心,即所有点到某个点的带权距离和最小。。保证点权一直非负。
事实上,我们发现树的重心和边是否带权没有关系,仅仅取决于点权。如下:
考虑从根开始不断走点权和大于等于一半的子树向下走的过程。一次移动的变化量为 ,即若是 ,就向下走。若维护出了点权意义下的 序列,那么重心就是 dfs 序最大的 的点。
问题就变成了求一个点的到所有点的权值和。即 。前两部分容易维护,最后一部分,修改时进行一次到根的链加,把贡献提前计算在路径上,查询时就也是只需进行一次路径和。。
事实上,我们也可以使用点分治来实现这个树二分的过程,当然有点杀鸡焉用牛刀了。
给一个有向图,支持两种操作
- 询问 − 的最短路。
- 修改一堆边,使得边权 。
,。总修改边数 。
实际上我们就是要争取对每次询问都跑一次 的最短路。解决办法是,建一张新图,每条边等于 ,修改时也修改在新图上,跑出新图的最短路,也就求出了原图的最短路的增量。
在这张新图上的最短路的性质是,设本次修改的边数为 ,那么新图的最长的最短路一定小于等于 。在值域特别小时,可以用桶来维护 dij
。具体来说,对于每个 dis
开一个队列,从左到右依次遍历每个队列来拓展。总复杂度就是 的。
给一个网格图,相邻的点有边,边权随机。
左右联通上下不联通,多次询问,删掉 列的点,剩余点最小生成树,询问独立。。
如果我们能做到 快速合并两个区间的 MST,我们就能维护出每个前缀的 MST 和每个后缀的 MST,从而在每次询问时也用同样的方法来合并一个前缀和一个后缀以得出答案。
假设已经知道了一个区间内的 MST,在右边界上加一条边,一定是在新形成的那个环上删去一条边。因此在它右边和另一个区间合并后,此区间内会删去的边仅仅在右边界所有点构成的虚树上。我们建出右边界上所有点的虚树,虚树上的每条边都是这条链上的最大边权;除此之外的边可以直接计入答案了,已经不可能被删去了。
事实上,由于右边和左边都有可能再经历合并,所以需要对于区间维护出左边界和右边界构成的虚树,以及除了此虚树之外的边的和。复杂度 。
从前往后确定每一个 ,每次令 ,然后
dfs
能到的点check
。如果会导致某个任意一个 和 都被选,则撤销,令 否则令 ,再check
一遍,如果还是不行,则无解。这样做复杂度是 的,但是求出来的解是满足字典序最小的。“取 SCC 拓扑序大的那个”的做法并不能保证这点。
用最少路径数覆盖一般图的每一条边。
一个经典的结论:
半欧拉图的判定:弱连通且恰有一个顶点 入度比出度小 ,一个顶点 入度比出度大 ,其余顶点入度等于出度,此时 分别成为起点和终点 。
推论:如果所有顶点入度与出度差的绝对值之和为 2k,那么可以用至少 k 条路径将图的每条边经过一次。
构造的话,直接把出度减入度为负的连向正的点,使得每个点的差都为 ,跑出欧拉回路,并把这些额外的边断掉即可。(无向图就是把奇点两两匹配)。
xxxxxxxxxx
71void dfs2(int u) {
2 for(int &e = head[u]; e; e = next[e]) {
3 if(vis[e]) continue; int t = e;
4 vis[e] = 1; dfs2(to[e]);
5 stk[++top] = t;
6 }
7}
个人玩 台游戏机,每台游戏机一秒内只能一人玩,每人一秒内只能玩一台。每台游戏机有个价格,在规定总价格内可以把一部分游戏机复制一次,每台只能复制一次。给每个人对在每台游戏机上的需求时间,求一种方案使得所有玩游戏结束的时间尽量早。。
一张图的最小边染色(使得不存在两条相邻边同色)若记为 ,则 。
特别的,对于二分图来说,。
设 表示第 个人需要多少时间, 表示第 个游戏机被使用的时长,当不能复制游戏机时,最小时间开销就等于 。证明的话,考虑把它建成一个二分图,每个人向每条机器连其需要的边数条边,于是我们要使每个人不能在同一秒玩两个游戏、同一个游戏机不能同时被两个人玩的条件也就转化为了最小边染色的条件;而最小边染色就等于 。
于是复制游戏机的选择也就很简单了——不断选择当前 最大的游戏机,把它分成均等两部分即可。
构造方案的话,考虑额外建立 个假人和 个假游戏机,然后现在人和游戏机之间连边,再用假人向游戏机连边,使得每台游戏机的度数都等于 ;在用假游戏机向人连边,使得每个人的度数都等于 ;再由假人向假游戏机连适量的边,使得每个假人和假游戏机的度数也都是 。
我们也就要构造出这张新图的边染色的方案,然后删去假点,显然失去的边仅仅表示空余的时间,依然会是合法的方案。而这张新图则十分有性质,所有点的度数都相等,由 Hall
定理得知这张图必然存在完美匹配。用合适的算法求出最大权完美匹配后,取出匹配中边权最小的那个边权,令匹配中的每条边都减去那个边权,并计入方案里,递归下去做。我们发现在图上不断地进行费用流(每次都得向点新连上容量为 的边)这件事情的复杂度可以接受。
也可以用最小边染色的方法来做,方法在下一题中讲解。
Berland 和 Beerland 之间有发达的航班网络,它们都属于 Berland 国营公司 BerAvia。每条航线将 Berland 的一个城市和 Beerland 的一个城市连接起来。最近,Berland 决定私有化 BerAvia,他们将航线卖给了 家私人公司。这些公司希望航线的划分尽量均匀。具体地,对每个城市 ,定义不均匀度 其中, 代表公司 拥有的经过 市的航线数量。 Berland 政府希望所有城市的不均匀度的平均值最小,请帮助它们找到最佳方案,并输出不均匀度的和。。
结论是,。即较为平均地分配,但有可能没法平均分,那就委屈一些公司,但都只委屈一条。证明的话,构造依然是构造一张二分图,并在左边和右边分别新建 个虚点。将每个左部点拆成 个点,前 个点都只用原图中的连边来使其度数达到 ;对于最后一个点,先把能连的边连上,再向右侧虚点连边(每个虚点只能连一条),使得度数也达到 。右侧点同理。于是我们就得到了一张度数均为 的二分图,我们即要求它的一个最小边染色。
这里介绍一种最小边染色的 构造方式。依次加入每条边 ,设 表示 点上没染过的最小颜色的编号。若 ,则直接填入 。否则,不妨设 ,那么我们还是填入 ,但是得想办法把 连接的那条等于 的边松开,于是我们直接将其改成 。设这条边连向的是 ,若 已经连向过 了,我们再去把 这条边改成 ……这样找增广路一定是有解的,因为 vizing
定理已经保证了总的有解;而这个算法的性质保证了每个点周围的颜色一定形如 ,所以这个当前想松开的 是严格递增的,是不会导致死循环的。粗略估计即可得到复杂度上界 。
给出一张无向(有向)带权连通图,求出一条总边权和最小的回路,使得经过每一条边至少一次。。
本质上其实是要复制一些边,使得每个点的度数都是偶数,且复制的边权和最小。显然每条边不会复制超过一遍。
考虑复制一条边的作用是什么。一个奇数点和偶数点之间连一条边,相当于把奇数点向偶数点移动了一步;而目标是一直走到另一个奇数点上,将其对撞掉。相当于,我们要把奇数点两两分组,使得彼此之间最短路的和最小。显然这些路径不相交,因为若边相交则可以交换目的地,路径总长会缩短,构成了一个类似 300iq Contest 1J 的证明。
如果是有向图,可以方便地用 KM 解决问题;但当问题是无向图时,看上去是一般图最大匹配,但实际上也可以用 KM 解决。
给一个有边权的二分图,求所有可能的完美匹配价值(即不是最大匹配,而是所有可能的值)假设边权 , 求一个多项式做法。
我们发现完美匹配实际上可以用排列来表示,如果我们要精确地统计出每种权值和地完美匹配各有多少个,我们可以列出如下式子:
我们发现这个式子很接近于行列式;我们直接改成行列式来计算,但是为了避免出现正一和负一抵消的情况,我们给每个 一个随机的系数。随后做两遍,看一看一项系数是否都是 。复杂度 。
有 个男生, 个女生,每人对所有异性有一个排名。要求一个完美匹配,使得不存在两对情侣中两个异性看对方都比自己情侣更好。。
根据生活经验,这个问题一定有解。因此我们采取类似增广路算法的方式,具体如下:
xxxxxxxxxx
91for (u = 任一个暂未匹配的男生)
2for (v = u 未曾尝试过的好感度最大的女生)
3// u 向 v 这个女生发起尝试
4if (v 单身) 直接匹配 u 和 v
5else
6令 w = v 当前的男朋友
7if v 对 u 更加喜欢
8u 的尝试成功,匹配 u 和 v,并将 w 重新丢回单身男生的序列
9else u 的尝试失败,继续尝试下一个女生去了
由于每个男生对每个女生最多只会追求一次,所以复杂度 。
这是一道交互题。Alice 和 Bob 又在玩游戏。 有一张二分图,左右各 n 个点,左右的点之间两两有边,每条边有边权, 保证边权两两不同。将左边的点标号为 ,右边的点为 。游戏的开始,甲需要选择增加或者减少,乙则会自动选择另一项,之后甲需要选定一个点,将棋子放在上面,之后从乙开始,轮流移动棋子移 动到一个之前没有移动到过的相邻点上,要求移动时要满足之前的选项,即如果甲选择增加,那么本次移动的边权必须大于上次移动的边权,减小通理,乙也是如此(第一次移动除外),第一个无法移动的人输了。由 Alice 决定做甲还是乙,帮助 Alice 与 Bob(交互库)对决,赢下这场 游戏。。
我们发现后手必胜。
不妨设先手选择了上升并任选了一个男生点。后手可以构造出这张图的一个稳定婚姻(男生喜欢小的女生,女生喜欢大的男生的稳定婚姻),每次直接走过当前点的匹配边。假设有两对情侣 ,。初始点在 点,后手可以走到 点。假设先手选择了从 走到 ,则由于 ,所以 一定会更欢 ;为了防止不稳定, 一定得更喜欢 ,也就是说 。也就是说,后手这一步一定能走。
有一个 个点的有向图,每条边有边权。有 组询问,每组询问给出一个非负整数 。你可以选定某些边,把分别它们的边权增加 ,要求满足 。 可以不是整数。问每次修改后 到 的最短路长度最大 是多少。每组询问是相互独立的。,。
题中这种最短路的线性规划形式和费用流的线性规划形式是对偶的。下面我们来手把手求这个线性规划的对偶。
设 表示 的最短路, 表示边 的增量, 表示边 原来的长度。我们可以得出如下的线性规划:
线性规划的对偶形式相当于把这个矩阵给转秩一下。我们给上面这个线性规划的每一行都乘上一个数,表示转秩后的自由元(转秩后的自由元个数等于原来的限制个数),并且都转成小于等于的形式,以符合对偶需要的性质,方便接下来的书写。
解释:上面的第二行就是每个限制条件乘上一个新的自由元,第三行用负号把 转化成了 ,第四行同第二行(也可以当作是把 转化成了 )。
于是我们就可以来转对偶了。目标函数部分,就是原线性规划的常数项的和(需要先移项到右边):
限制条件上,依次提出每一个原来的自由元的系数,作为新的限制条件,而常数项是这个原自由元在原目标函数中的系数。比如我们先提出 的限制条件:
再试着提出 的限制条件:
提完了之后添上不等式的限制条件:
这就是原线性规划的对偶了。我们思考它的性质: 是游离于整个线性规划之外的,只在第二个限制条件中出现,我们完全可以构造出一种合适的 使得 。而 的目标函数的系数是大于 的,我们自然要最小化 ,且 ,所以我们前面的这种构造已经是最优的了。于是变成了这样一个问题:
上面的所有 在限制条件中均只出现两次,所以我们建出上面这个线性规划的费用流形式。 和 之间连有容量为 代价为 的边。这张图显然几乎满足网络流图性质(除了原点和汇点),并且 。设其总流量 ,令所有的 同时乘以 ,就可以得到本问题的符合流平衡的方程:
直接跑最小费用流,考虑单次询问的处理。我们发现同一次增广内的 是相等的,且大于等于 ,并且总的来看 关于 是凸的(越增长越慢)。 却越来越小,即 的斜率越来越小。这是一个斜率越来越小且截距越来越大的直线集,对我们有用的就是这个直线集的下包络线。对于每次询问,都遍历每次增广,并求出其在包络线上的最低点即可。