Codeforces 图论板刷总结(更新中)

图论太菜了呀,那怎么办呀,刷点题吧,写下来可以以后复习?或者造福后人?这blog估计也没什么用?
大概就从这开始刷吧:Link

简单题解

  • 786B 区间图最段路
  • 741C 构造题 二分图
  • 567E 最短路DAG必经边
  • 527E 欧拉回路
  • 1147D 建图 划分等价类
  • 724D 图 线性基
  • 1023F 生成树 思维
  • 571C 建图 定向 思维
  • 627D 二分 DP
  • 85E 二分 染色
  • 542E 推理
  • 141E 拟阵推理
  • 266D 直接做
  • 825G 拓扑排序 贪心
  • 241E 差分约束 输出方案
  • 8E 数位DP
  • 1209F Dij最短路+字典树比字典序
  • 346D SPFA
  • 480D DP
  • 132E 最小费用流:DAG的某种带权覆盖?
  • 358E 欧拉路径
  • 311C 最短路
  • 813F 时间线段树 + 可撤销带权并查集
  • 1218D 仙人掌 + FWT
  • 45H 树补成边双

786B 区间图最段路

没啥好说的,标准的区间图最短路,建议整理板子。我的板子:Link

741C 构造题 二分图

很容易被搞到2-sat上去,但是猜到一定有解的情况下, 构造出二分图就做完了。我反正智商是没了。

567E 最短路DAG必经边

可以通过方案数来确定一条边是否必经,最好双模,曾经被卡过QAQ。简单题。

527E 欧拉回路

首先容易想到要先把每个点的度数补成偶数,这是必要的。然后这个条件就让人想到存在欧拉回路,然后构造答案:如果回路长度是奇数,增加一个自环,变成偶数。偶数则直接给边按照左右左右这样定向就做完了。我反正智商又没了。
大概就是把欧拉回路类比成简单环去考虑吧,这样就比较容易想到这样构造了?

1147D 建图 划分等价类

首先要枚举a的位数,因为a前边那些0是不参与回文的。将a,b的每一位取0,1分别建一个点,总共4n个点,然后回文,异或这两个条件会产生一些等价条件,使用并查集维护。然后还有一些值已经确定了,比如b首位是1,a前边若干个0,然后有一位是1,在检查完合法性之后,剩下的自由元可以任意取值,答案就是一个2的幂次。
有点类似于2-sat吧,但是因为这里是等价关系(双向边),就比较简单了。数自由元需要用到图是对称的。

724D 图 线性基

这个题比较套路。。有三个要素:无向图,路径长度定义为异或和,不必要简单路径。
这三个东西导致了一个套路:两点间的所有路径的值可以由任意一条路径的值,再经过任意的环组合。那我们只需要将所有的环的路径值加入到线性基里面,就可以轻松处理答案了。
而环是不可能全找出来的,但是由于一个环可以由其他的环组合出来,且要维护的是异或基,因此只需要找到一些基环(基向量),让他们足够来组合(张成)出所有的环(向量)即可。

1023F 生成树 思维

给边定值的时候,边的考虑顺序不会影响答案。
(原图只需要保留一个mst)证明:假设有两条虚线的边是我们的边,红色蓝色紫色都是原树的边,现在想要同时加入这两个虚线边。首先显然加一条边的时候,需要把这个边的值定为树上路径上的最小值,同时删掉树上那个最小的边。
那么只需要讨论两条路径上要删掉的那个最小边的位置,很容易就能证明。
Codeforces 图论板刷总结(更新中)_第1张图片
由于输入已经排好序了,直接并查集。

571C 建图 定向 思维

一些预处理是很简单的:如果一个变量只出现了 a a a或者只出现了 ∼ a \sim a a,则可直接确定这个变量的取值,然后将该合取式删除,这会导致一些新的变量出现上边这样的情况,所以要跑一个拓扑排序。
剩下的就只有每个变量在一个合取式中是 a a a,在另一个合取式中是 ∼ a \sim a a,显然这个 a a a变量只能使得一个合取式得到满足,因此我们在这两个合取式间连一个边,我们要做的是给边定向,使得每个点都至少有一个入度,显然树是非法的(只有n-1个边,只能满足n-1个合取式),其他都是合法的,任意找一个环,然后先把环定向,其他的就搞一个基环外向树。
题目中每个变量至多出现在两个合取式的条件,已经明示了做法,想到建图就做完了。

627D 二分 DP

二分+DP,有一些细节需要仔细讨论一下。

85E 二分 染色

最大值最小,直接二分答案,然后在不满足条件的点之间连边,然后要求这个图可以二染色,直接dfs走一遍check就行,一个连通块方案数为2,因此总方案数是 2 c o m p o n e n t 2^{component} 2component.

542E 推理

容易从三元环发现只要存在奇数长度的环,则一定是-1,这等价于判断能否二染色。
然后这个题很重要的东西就是环了,容易观察到一些结论:1如果有多个连通块,则答案是各个连通块的和,2如果是一棵树,答案就是直径,3长度为2n的裸环答案是n(对折)。再分析一下就能发现:以任意两点为链的端点,链长将等于这两点的最短路,因为他是最短的,没办法附体到其他的链上。然后就做完了。

141E 拟阵推理

先求只用S边的生成森林,然后再加入一些M边,变成一棵树,这些M边是必选的。
然后重新再来一次,先加入必选的M边,然后再加入一些M边,使得M边总数达到一半。
之后再尝试加入所有S边,即得到答案。
严格证明要用拟阵推。
所以我为什么乱搞谢了个 随机边权+wqs二分??仿佛一个睿智。

266D 直接做

开始想到很多骚操作,但是你画一个环就能全否掉,基本都用了树的性质,不能推广到一般图。
这题就是找图的绝对重心(我看其他博客是这么叫的?) 做法肯定是枚举每一条边 ( u , v , w ) (u,v,w) (u,v,w),求这条边上的答案。很不幸,答案没有三分性质。设重心点和 u u u的距离是 L L L,则答案= min ⁡ { max ⁡ { min ⁡ ( d i s [ i ] [ u ] + L , d i s [ i ] [ v ] + w − L ) } } \min{\{\max{{\{\min(dis[i][u] + L,dis[i][v] + w - L)\}}}}\} min{max{min(dis[i][u]+L,dis[i][v]+wL)}}
最内层的那个东西是一个天线函数,然后多个天线函数取max,然后求这个图像的最小值。直接做就行了。

825G 拓扑排序 贪心

直接拓扑排序,每个点贪心选择。

241E 差分约束 输出方案

每条边 ( u , v ) (u,v) (u,v),转换成两个约束 d i s [ u ] ≤ d i s [ v ] − 1 dis[u] \le dis[v] - 1 dis[u]dis[v]1 d i s [ v ] ≤ d i s [ u ] + 2 dis[v] \le dis[u] + 2 dis[v]dis[u]+2,然后注意先跑两遍把1-n的DAG子图抠出来,然后跑差分约束,并输出方案。

8E 数位DP

这题是个数位DP啊?
但强行图论也能做,但是不能过。首先我们建 8 n 8n 8n个点,分别代表原串、反串、逆串、逆反串每个位置是0还是1,然后逐位确定来求字典序,求方案数的时候,只需要把所有限制关系(包括四个串本身的对应关系,以及字典序限制,字典序直接 n 3 n^3 n3枚举决定字典序的位置)用并查集合并出来,然后检查完所有冲突之后,数自由元的数量,答案就是一个2的幂。但是这样是 O ( 8 ∗ n 5 ) O(8*n^5) O(8n5)很难过。

1209F Dij最短路+字典树比字典序

用字典树存每个点的完整答案,然后跑Dijkstra最短路,需要字典树支持比较两个点的串字典序的操作,那当然是求lca了,用st倍增动态维护就好了。比赛时候没调出来,system test完就调对了。

346D SPFA

如果是DAG的话好做。 d p [ u ] = min ⁡ { max ⁡ { d p [ v ] } , min ⁡ { d p [ v ] } + 1 } dp[u] = \min{\{\max{\{dp[v]\}},\min{\{dp[v]\} + 1} \}} dp[u]=min{max{dp[v]},min{dp[v]}+1}
但是这个题是有向图。别问,问就SPFA。不想写了。

480D DP

如题 DP。直接在DAG上DP很不方便,转成时间区间做DP。非要说跟图有啥关系的话呢。。这个DP很像是树的dfs序DP。

132E 最小费用流:DAG的某种带权覆盖?

根据题意可以很容易作出一个完全图DAG:对于任意点对 ( i < j ) (i < j) (i<j),连接一条 i i i j j j的边,如果 a [ i ] = a [ j ] a[i] = a[j] a[i]=a[j],则边权是0,否则是 p o p c o u n t ( a [ j ] ) popcount(a[j]) popcount(a[j])。再来一个超级起点 S S S S S S连向所有点 i i i,边权是 p o p c o u n t ( a [ i ] ) popcount(a[i]) popcount(a[i])

那么这题求的就是,选出至多 m m m边不相交的路径,使得每个点被覆盖且只覆盖一次,最小化边的权值总和。

建图方法是:每个点拆成两个点:入点 A A A,和出点 B B B,连接一条 ( c o s t = − i n f , f l o w = 1 ) (cost = -inf, flow = 1) (cost=inf,flow=1)的从 A A A B B B的边,然后跑最小费用流(不是最小费用最大流),这样可以保证所有 c o s t = − i n f cost = -inf cost=inf的边都被用过,即实现了点的覆盖的要求。

然后输出方案。。。

358E 欧拉路径

找到图中最长的连续1,则答案只可能是该长度的因子,只有根号种,每种判断即可,注意细节,判定等价于关键点图上存在欧拉路径。

311C 最短路

因为 k k k小,只需要求出 % k = i \%k = i %k=i的点能到达的最小点是什么,其他更大的 % k = i \%k=i %k=i的点都是可以从这个点 + v ⋅ k +v\cdot k +vk到达。建图跑最短路即可。剩下的随便用优先队列做就行了。

813F 时间线段树 + 可撤销带权并查集

如题。

1218D 仙人掌 + FWT

只有42个环的仙人掌,求异或意义下的最小生成树计数,也就是每个环选一个边删掉,直接42个FWT卷积出来方案数,然后就是类似字典树找异或最小值,实现的时候不需要lca数据结构,也不需要字典树,简单粗暴就行了。
这题还卡了方案数 % M o d = 0 \%Mod=0 %Mod=0的情况。
一般的仙人掌 也可以做啊?,复杂度不坏于 O ( B ∗ M ∗ 2 B ) O(\sqrt{B * M} * 2^B) O(BM 2B)

45H 树补成边双

先把原图缩成树,然后答案是(叶子+1)/2,先随便扔掉一个点,剩下偶数个点按照dfs序排序,然后分成前一半和后一半,按照顺序相互连边,最后那个单独的随便连。

你可能感兴趣的:(Codeforces,专题练习)