[学习笔记]图论提高题目选做

口胡的题目真多(huaji)

Part1 图论基础

P3275 [SCOI2011]糖果

传送门
对约束建边,理论上来说会有5类边,但稍加思考会发现其实本质上只存在 a x < a y a_x<a_y ax<ay a x ≤ a y a_x\leq a_y axay两种边。
显然可以差分约束,第一种限制等价于 1 ≤ a y − a x 1\leq a_y-a_x 1ayax,第二种限制等价于 0 ≤ a y − a x 0\leq a_y-a_x 0ayax,建边跑最短路即可。已经死去了的 SPFA可以直接判断题中的 正环。
当然如果不用SPFA的话,我们将每一个强连通分量缩成一个点,显然强连通分量中的边全0,再拓扑排序求最短路即可。

CF723F st-Spanning Tree

传送门
删去 S , T S,T S,T点,剩下的联通块有三种情况:
1.先前与 S , T S,T S,T点都有连边。
2.先前只与 S S S点有连边。
3.先前只与 T T T点有连边。
首先对每个连通块先做生成树,然后后两种情况直接与 S , T S,T S,T连回去,对于第一种情况我们贪心的连边使得其尽量满足题目要求即可,注意还要考虑先前 S S S T T T之间的边。
说起来这么简单其实代码…

CF575G Run for beer

传送门
首先连成的数字可以有前导0,这很麻烦,因此我们先直接处理从终点开始的所有可以完全走0边到达的点组成的联通块,我们将其都设为起点。
然后我们在这个图上跑长度最短且字典序最短的最短路即可。
具体来说我们在做Dij时将堆内的cmp函数修改一下即可。

ZROI879 小K与重建计划

n n n个点 m m m条边的无向图,点有点权 a ( x ) a(x) a(x),边有边权 b ( x , y ) b(x, y) b(x,y)
现在需要依次进行 n − 1 n-1 n1次缩边操作:每次选择一条边 ( u , v ) (u, v) (u,v),把 u u u v v v合并成一个点,新的点权 a ’ = a ( u ) + a ( v ) − b ( u , v ) a’ = a(u) + a(v) - b(u, v) a=a(u)+a(v)b(u,v)。要求任意时刻所有点的点权非负。
判断是否能完成,并给出方案。保证初始点权和边权均非负。
n , m ≤ 1 0 5 n,m\leq 10^5 n,m105

显然我们先求出原图的一个最小生成树,因为容易发现其它的边如果操作并不会使答案更优。
考虑将三个点合并在一起的代价就是 a ( u ) + a ( v ) + a ( k ) − b ( u , v ) − b ( v , k ) a(u)+a(v)+a(k)-b(u,v)-b(v,k) a(u)+a(v)+a(k)b(u,v)b(v,k),因此可以归纳出最终的点全就为 ∑ u a ( u ) − ∑ T ∈ ( u , v ) b ( u , v ) \sum_u a(u)-\sum_{T\in(u,v)}b(u,v) ua(u)T(u,v)b(u,v)
可以猜到只要最终点权非负我们一定有一种方案可以实现,我们可以使用反证法来简单的证明这个结论。
现在考虑构造这个解,首先一个显然的方法是每次 O ( n ) O(n) O(n)找到树中可以合并的边暴力合并起来,这样做是 O ( n 2 ) O(n^2) O(n2)的。
考虑如何优化解法,考虑对于一颗树,我们任选一个根开始将每个儿子整个联通块合并上去。
首先根节点它的最终点权一定是正的,那么它的儿子 v i v_i vi中有一些其儿子点权减去根-儿子的边权也是正的,我们首先合并这一些儿子,能让当前之后无论如何合并其权值都大于零,之后我们再合并其他这个权值小于零的儿子。
那么我们每次传给儿子 v v v的任务求是:
现在它的父亲为 x x x,当前其权值为 v a l val val,链接 x − v x-v xv的边权为 w w w,你现在需要将 v v v合并到 x x x上,且过程满足要求。
发现这和根需要处理的几乎相同,但是需要注意的是,如果 0 ≤ v a l − w 0\leq val-w 0valw,我们需要在合并 v v v权值小于零的儿子之前合并 x x x v v v,如果我们不合并就可能无法满足要求。

Part 2 匹配与网络流

CF510E Fox And Dinner

传送门
降智好题。
注意到 2 ≤ a i 2\leq a_i 2ai,那么 a a a的和一定是一个奇质数,那么环的情况一定会呈现奇偶交替的样子。这很有二分图的感觉。
因此我们 A A A部全部放 a i a_i ai为奇数的点, B B B部全部放 a j a_j aj为偶数的点,然后满足 a i + a j = p a_i+a_j=p ai+aj=p的连一条容量为1的边,原点和 A A A部,汇点和 B B B部都连上容量为 2 2 2的边。
然后我们保证最大流为 n n n输出方案即可。
这里限制一个环巧妙运用了度数的限制,并使用满流使得问题解决。

[Bytedance Camp 2019]Deep in the Ocean

n n n个点 m m m条边的无向图,满足每个点度数相等且是偶数。在里面找出一个边的子集,满足每个点的度数是 2 2 2
n , m ≤ 1 0 5 n,m\leq 10^5 n,m105

神奇思路…
在图中找出若干个环,和我们上一道题目的要求比较类似,但是现在还需要环不止有偶环。
首先一个结论是正则图(所有点出入度均相等的图)一定拥有一个完美匹配。
这可以通过Hall定理直接证明出来。
由于原图是一个正则图,那么其拆点后建出的网络流一定满流。
然而原图是无向图,对于一条无向边我们在图上会建两条边,这就会存在拆出来的两条边都被使用的情况,而这显然是不合法的。
注意到原图度数都为偶数,那么它一定存在欧拉回路。我们又知道用欧拉回路定向后的图也是正则图(每个点入度=出度),因此同样存在合法方案。

CF802C Heidi and Library (hard)

传送门
我个脑残居然不会用负权边…
考虑每个点先默认购买当天的书,如果发现可以节省再走一道代价为负的边来抵消。
我们每设两个点 v i v_i vi v i ′ v'_i vi,建图如下:

  • 先默认购买当天的书,从 S S S v i v_i vi代价为 c a i c_{a_i} cai,容量为 1 1 1的边。
  • 选择不保留当天的书,从 v i v_i vi v i ′ v'_i vi代价为 0 0 0,容量为 1 1 1的边。
  • 每天可以保留 k − 1 k-1 k1个书在书架中(除去当天用的书),从 v i v_i vi v i + 1 v_{i+1} vi+1代价为 0 0 0,容量为 k − 1 k-1 k1的边。
  • 使用保留的书抵消当天的消费, v i v_i vi连上一个 j j j使得 a i = a j a_i=a_j ai=aj的点 v j ′ v'_j vj 代价为 − c a i -c_{a_i} cai,容量为 1 1 1的边。
  • 保证不保留和抵消操作只能选择其中一个 v i ′ v'_i vi T T T连代价为 0 0 0,容量为 1 1 1的边。

本题建图的关键就在于在保证流量满流的情况下合理的描述保留的图论意义。

Part 3 冷门图论算法

保序回归问题

学习笔记

Part 4 杂题

P2341 受欢迎的牛

传送门
如果存在则答案一定是度数为0的强连通分量的siz。

P3684 [CERC2016]机棚障碍

传送门
我们将箱子左上角为起点行走,那么每个格子能够通过的箱子大小不尽相同,我们箱子最大的大小显然就是这个条路径上通过的箱子大小最小的点。
根据NOIP货车运输的思路,我们将点权下放到每条边上,那么我们只需要保留原图的最大生成树。
接下来我们倍增即可。
当然一种更加明智的做法就是直接在启发式合并的并查集上暴力爬树,因为这棵树的深度是 O ( log ⁡ n ) O(\log n) O(logn)的。

CF555E Case of Computer Network

传送门
结论是一个原图中的边双连通分量一定可以被定向为一个强连通分量。
那么我们对边双缩完点后原图成为一棵树,对于限制我们只需要树上差分即可。

AGC044B Joker

传送门
又一道降智好题…
注意到一开始 ∑ d ( x , y ) \sum d(x,y) d(x,y) O ( n 3 ) O(n^3) O(n3),一次修改会让若干个 d d d减一,那么我们只需要保证暴力修改时只遍历到会被修改到的点即可。而这显然可以用一个dfs来扩展得到。

P5304 [GXOI2019]旅行者

传送门
三种方法:

  • 做法1:每次把一半关键点当作起点,另一半当作终点跑一次最短路,对每个二进制位分,log次就一定包含最优解。

  • 做法2:直接求最短路并记录每个点的最短路是从哪个关键点出发的,多个相等的就记录任意两个,然后对每条边更新。

  • 做法3:对每条边更新

HDU 6403 Card Game

给定 n n n 张卡片,每张卡片正反面各有一个数。问至少要翻转多少张卡片,才能使正面向上的数互不相同,并求方案数。
n ≤ 1 0 5 n\leq 10^5 n105

不知道为什么我首先想到的是2-SAT…
考虑我们现在正面的数向反面的数连一条有向边,那么现在我们需要翻转一些边使得每个点出度 ≤ 1 \leq1 1
由于每个点出度 ≤ 1 \leq 1 1,那么总出度 ≤ n \leq n n,因此可以发现每个弱联通分量均为基环树或者树。
对于一颗树我们选一个根然后生成一个外向树即可。
对于基环树我们可以选择环的方向是顺时针还是逆时针。
至于计算最小反转次数,对于树的情况我们可以用非常基础的换根来实现,对于基环树我们暴力讨论正向还是逆向然后分别统计一下即可。
复杂度: O ( n ) O(n) O(n)

CF1023F Mobile Phone Network

传送门
其实是一道简单题…
对于白边我们首先强制先加入最小生成树中,显然这会使原图变成一个森林,对于其中的每一颗树上的黑边 ( u , v ) (u,v) (u,v),由于它没有被加入到最小生成树中,那它一定会大于 u , v u,v u,v路径上的每条边的边权。
那么我们可以认为一开始每个白边的权值为 + ∞ +∞ +,每次我们会对 u − v u-v uv路径上的边权取 min ⁡ \min min,求最后的边权和。
这显然可以用树链剖分+线段树解决,但是这样太麻烦了,还会被卡空间。
由于不带修我们考虑将操作按权值从小到大排序,那么每次我们只会修改路径上还没有赋权的点,由于总共点数为 O ( n ) O(n) O(n)的,我们在修改完这个点时用并查集与它父亲合并,这样我们就能够快速找到下一个没有被修改的点了。
复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

ZROI 1254 迷宫

题解

Bytedance Camp 2020 Airlines

给定一个 n n n 个点 m m m 条边的无向图,边有 k k k 种颜色之一,且不存在两条端点和颜色都一样的边。求一个欧拉回路,满足回路里任意两条相邻的边颜色不同。
n ≤ 1000 n \leq 1000 n1000
加强版: n ≤ 1 0 5 n \leq 10^5 n105

首先直接给出符合条件的等价充要条件:图存在欧拉回路,每个点没有超过一半的同色边。
考虑一个求欧拉回路的做法:

对于一个点连出去的 n n n条边,我们将其中的一半和另外一半随便两两连起来,这样我们虽然没有得到欧拉回路,但得到的若干个环,而这些环两两的公共点显然最多一个。
然后我们按照一定的顺序将这些环通过公共点组合起来就是一个合法的欧拉回路。

对于本题,根据条件我们肯定能够找到一种链接方式使得每个环的相邻两条边不同色(因为我们在组合的时候可以贪心处理一下)。而我们在环两两组合的时候,虽然有可能出现相邻边反向的情况,但我们发现这时候我们将这个环的路径反向就不会发生这种情况了。
直接暴力路径反向 O ( n 2 ) O(n^2) O(n2)可以通过原题,考虑到路径反向也可以用双向链表方便的解决,这样我们的算法就优化到了 O ( n ) O(n) O(n)

CF786E ALT

传送门
裸的最小点覆盖但是需要倍增优化建图。
之前做过的一道题,现在来写估计也会吐掉…

SGU 307 Cipher

也是做过的一道题,跳过。

[JOISC2020]迷路的猫

传送门
通信题真毒瘤。其实思路还是比较简单。

首先是图的情况,此时 A > 2 A>2 A>2
考虑BFS生成一颗树,标记一条边 ( u , v ) (u,v) (u,v) min ⁡ ( d i s u , d i s v )   m o d   3 \min(dis_u,dis_v)\bmod 3 min(disu,disv)mod3,对于一个点 x x x,此时父亲的标记为 d i s x − 1   m o d   3 dis_x-1 \bmod 3 disx1mod3,横叉边和儿子边标记都是 d i s x   m o d   3 dis_x \bmod 3 disxmod3,那么有一个标记是不存在的,因此我们总能通过这个标记找到父亲。
然后是树,此时 A = 2 A=2 A=2
注意到度数为 1 1 1和大于 2 2 2的点我们都能通过看0,1标记的数量来确定方向。而度数为 2 2 2的点如果不是起点我们当然也可以一直走下去。
考虑一条链的情况,假如我们从链的中间开始,此时我们就需要通过边的标记来判断是否走对了方向。
假设猫在路径上试探出的字符串为 S S S,那么我们需要保证 S S S和反转串 S R S^R SR循环节本质不同。
自己手算半天可以发现S=010011是一个合法的且长度最小的 S S S
然而我们直接走最坏会多走 6 × 2 = 12 6\times 2=12 6×2=12步来判断。
然而猫其实可以知道边上的两个点的另外一条边的信息,而我们其实只需要知道 5 5 5个数字就能得到第六个数字,因此我们只需要走 3 × 2 = 6 3\times 2=6 3×2=6步就可以了…

GYM 100739H Hard Molecules

给定一个连通图中每个点的度数,求一个满足条件的图,图可以有重边,不能有自环。
n ≤ 5000 , d i ≤ 1 0 9 n\leq 5000, d_i\leq 10^9 n5000,di109

我们知道满足度数限制的树是很好构造的,而题目首先要求图联通,因此我们一颗先生成一颗生成树然后在这颗树上加边。
构造好了一颗生成树后,我们就没有必要保证接下来的加边的联通性了,那么我们很容易发现只要除去生成树后度数最大的点小于等于度数和的一半即可,这很好理解。
写成式子即为:
∑ d i = 2 n − 2 ∀ i   d i > 0 ∑ D i − d i   m o d   2 = 0 max ⁡ { D i − d i } ≤ ∑ D i − d i 2 \sum d_i=2n-2\\ \forall i\ d_i>0\\ \sum D_i-d_i \bmod 2=0\\ \max\{D_i-d_i\}\leq \frac{\sum D_i-d_i}{2}\\ di=2n2i di>0Didimod2=0max{Didi}2Didi
一些限制很好满足,现在主要的问题是如何分配 d i d_i di使得第四个式子成立。
首先每个 d i d_i di至少为 1 1 1,其余 n − 2 n-2 n2个值随意分配,那么我们会想办法使得除去生成树后度数最大值最小。其实我们只需要建树的时候每次找一个还没加入树中且度数最大的点和已经加入树中且度数最大的点连边即可。
建好树后我们将点分为等大的两个集合然后依次连边即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值