图论选讲
图论选讲
图论就两个东西,模型转化和找性质。
再加上套一些操作结构或者做成DP。
树上问题已经讲烂了,二分图和网络流一起讲。
本次主要选讲图论建模相关问题。
附带一些神秘题。
P10573 [JRKSJ R8] C0mp0nents
小 I 有一张 \(n\) 个点、\(m\) 条边的无向图,保证图无重边、无自环。初始时第 \(i\) 个点的点权 \(a_i = i\)。小 I 有一个额外的常量 \(k\)。
小 R 可以进行很多很多次操作。每次操作,她选择图上两个相邻的节点 \(x, y\) 满足 \(\lvert a_x - a_y \rvert = k\),随后小 I 会将 \(a_x\) 设为 \(a_y\)。
对每个 \(1 \leq s \leq n\),如果在过程中不修改 \(a_x = s\) 的节点 $ x$ 的权值,小 I 想知道:若干次操作后,图上最多有多少个点满足 \(a_i = s\)。
对于所有数据,满足 \(1 \leq k \leq n \leq 4\times 10^5\),\(1 \leq u, v \leq n\),\(0 \leq m \leq 10^6\),保证图无重边、无自环。
Sol
mod k将单点权值设为商,转化为 \(k=1\) 的处理。
对于一段区间 \([l,r]\),要满足 \(l\leq s\leq r\),则有 \([l,s-1]\) 都向比它小且在 \([l,s-1]\) 内的点连边。 \([s+1,r]\) 同理。
可以方便地处理出最大的比 \(x\) 小的点 和 最小的比 \(x\) 大的点,\(s\) 增加时对应的 \(r\) 满足单调性,顺序递推即可。
复杂度 \(O(n+m)\)
P9697 [GDCPC 2023] Canvas
有一个长度为 \(n\) 的序列,一开始序列中的所有元素均为 \(0\)。另外还有 \(m\) 个操作,其中第 \(i\) 个操作会将序列中第 \(l_i\) 个元素的值改为 \(x_i\),以及将序列中第 \(r_i\) 个元素的值改为 \(y_i\)。每个操作必须恰好执行一次。
求执行操作的最优顺序,使得所有操作执行完成后,序列中所有元素之和最大。
保证所有数据 \(n\) 之和与 \(m\) 之和均不超过 \(5 \times 10^5\)。
Sol
先考虑逆序操作。
操作对答案贡献:\((u,2,v,2)>(u,1,v,2)>(u,1,v,1)\) ,考虑中间那种
如果有 \((u,1,v,2)\) 后做,那 \((v,1,w,2)\) 先做对 \(v\) 没有影响。
对所有 \((u,1,v,2)\) 连 \(u\rightarrow v\) 的边。
强连通分量内部任意点开始操作,只有起始点为 \(1\) 其余为 \(2\)。
对缩点后图跑DAG最优。
附:强连通分量内部有 \((u,2,v,2)\) 以此为起点最优。
CF1967D Long Way to be Non-decreasing
给定长为 \(n\) 的序列 \(a_i\) 和长为 \(m\) 的序列 \(b_i\) 。
定义一次操作如下:
- 选定一个下标集合 \(S\)
- 对于 \(\forall i \in S,a_i\leftarrow b_i\)
求至少需要多少次操作能使得序列 \(a\) 单调不降。
\(n,m\leq 10^6,a_i,b_i\leq m\)
Sol
求最少操作次数想到二分操作次数 \(mid\)。
令 \(b_{a_i}\leftarrow a_i\) 连边,可得一棵基环树。
若我们已钦定 \(a_{i-1}\),贪心地去选取 \(a_i\),那么要求 \(mid\) 次步下能走到的点里最小的大于 \(a_{i-1}\) 的数。
可以用树剖或者主席树,复杂度不能接受。
考虑离散化后 \(\sum(a_i-a_{i-1})\leq m\)。
基环树上可以 \(O(1)\) 求出两点距离,从小到大枚举 \(a_i\) 的大小 \(x\),如果当前 \(x\) 能够满足 \(mid\) 步,考虑 \(a_{i+1}\)。
总复杂度 单log
CF1956F Nene and the Passing Game
篮球队有 \(n\) 名队员,第 \(i\) 名队员手臂长度为 \([l_i,r_i]\)。\(i,j\) 两名球员能够互相传球当且仅当 \(|i-j|\in[l_i+l_j,r_i+r_j]\)。
现在进行 \(p\) 组训练,每次训练可用一个长度 \(m\) 序列表示。要求相邻两位球员之间能相互传球。同位球员可出现多次。
求使得所有球员都训练过的最小的 \(p\) 是多少。
\(n,m\leq 2\times 10^6,l,r\leq n\)
Sol
题目转化后要求 \([i+l_i,i+r_i]\) 与 \([j-r_j,j-l_j]\) 有交集。
令 \(L_i=[i+l_i,i+r_i]\),\(R_i=[i-r_i,i-l_i]\)。
线段树建图。
有一个问题是仅仅 \(L_i\) 与 \(L_j\) 有交集时 \(i,j\) 也能联通。
将树上仅有 \(L_i\) 的点删去即可。
P9150 邮箱题
有一张 \(n\) 个点和 \(m\) 条边构成的有向图。每个点内都有一把另一个点的钥匙,\(i\) 号点内有 \(k_i\) 号点的钥匙。你能进入一个点当且仅当你有该点的钥匙。保证 \(k_i\) 构成排列。
只要进入了一个点,就获得了这个点内有的钥匙。一旦获得钥匙就不会被消耗。
现在你拿到了 \(i\) 号点的钥匙并到了 \(i\) 号点。你需要对每个 \(i\) 求出:
- 有多少点能被你到达。
- 有多少点能被你到达并返回起点 \(i\)。
请注意:给出的边均是有向边!
对于 \(100\%\) 的数据,满足 \(n \ge 3\),\(m\ge 0\),\(\sum n\le 1.5\times{10}^6\),\(\sum m\le 3\times{10}^6\),\(1 \le T\le 2\times{10}^4\),\(1 \le x, y \le n\),保证图中不含重边或自环。
Sol
将每个点向它拥有钥匙的点连边,形成若干个环。答案一定是环内的点。
一个经典的处理方式是复制两遍断环成链,重编号为 \(1,2,...,k,1,2,...,k\)。
从后往前做,考虑若求出了 \(a_{i+1}...a_{2k}\)的答案,怎么求出 \(a_i\) 的答案。
\(a_{i+1}...a_{2k}\)会形成若干个强连通分量成链,可加入 \(a_i\) 作为一个单独的强连通分量,考虑能否合并链上前 \(k\) 个为同一强连通分量。
一个并查集维护连续链,另一个并查集维护强连通分量。
CF429E
给定 \(n\) 条线段 \([l_i,r_i]\),给这些线段红蓝染色,求一种最后直线上任意一个点被蓝色及红色线段覆盖次数之差不超过1的方案。
\(n\leq 10^6,l_i,r_i\leq 10^9\)
Sol
对 \(l_i\)向 \(r_i\) 连边,手动补齐奇数边,跑欧拉回路。
Atcoder arc165 f
给定 \(n\) 和长为 \(2n\) 的序列 \(a\) ,满足 \([1,n]\) 每个数恰好出现两次。
每次操作可以交换相邻的两个数,询问最少多少次操作可以使得序列 \(a\) 满足 \(\forall i\in[1,n]\),\(a_{i\times 2-1}=a_{i\times 2}\)。
\(n\leq 2\times 10^5\)
Sol
若 \(i\) 出现的的位置为 \(l_i,r_i(l_i\leq r_i)\),那么
- \([l_a,r_a]\) 与 \([l_b,r_b]\) \((r_a\leq l_b)\) ,先处理 \(a\) 更优
- \([l_a,r_a]\) 与 \([l_b,r_b](l_a\leq l_b\leq r_a\leq r_b)\), 先处理 \(a\) 更优
因此令 \(a\) 对所有满足第一种情况的 \(b\) 连边(可持久化线段树优化)
跑字典序最小拓扑序。
Atcoder arc153f
给出 \(n(n\leq 2\times 10^5)\) 个点 \(m(m\leq 2\times 10^5)\) 条边的简单无向联通图。
你可以将每一条边染成 \(1,2,3\) 三种颜色之一,问不同的染色方案数,使得图中存在一条简单路径(不经过重复点),其上同时存在三种颜色的边。答案对 \(998244353\) 取模。
Sol
“图上存在一条路径” 这样的弱限制问题不太好做,考虑容斥图上不存在这样的路径。
先钦定三种颜色都要出现。
先考虑树怎么做。一定是选一个点作为根,子节点的子树边必须染成同一种颜色。
容斥下,令 \(x\) 为度数 \(f(x)=3^x-3(2\times x)+3\)
对于强连通分量,有一个非常好的处理方式是圆方树。
建出圆方树后发现可以避免大量分讨,钦定某个圆点为根后要保证子树内方点颜色都相同。
P10665 Bytehattan
给定一张平面图,每次删掉图中一条边 \((u,v)\),需要回答删除这条边后 \((u,v)\) 是否联通。
点数、边数\(\leq 10^6\)
强制在线。
Sol
建对偶图判断是否成环。
CF241E Flights
给定 \(n(n\leq 1000)\) 个点 \(m(m\leq 5000)\) 条边的有向无环图,初始时每条边权值为 1,要求将某些边的权值改成 2 使得所有从 1 到 \(n\) 的路径的总长度都相同。
Sol
考虑 \(u\rightarrow v\) 这条边,令 \(dis_u\) 为 \(u\) 到 \(n\) 的距离,则 \(1\leq dis_u-dis_v\leq 2\)
对上述不等式跑差分约束,要扣掉无法从 1 到达和无法到达 \(n\) 的点。
Atcoder arc114e
给定 \(n(n\leq 3\times 10^5)\) 个点,\(m(m\leq 3\times 10^5)\) 条边的有向无环图,任意一条有向边满足起点编号小于终点编号。每个点有点权,有些点的点权未知。
需要找到一种给未知点权值的方案,使得所有 \(1\rightarrow n\) 的路径点权和的最大公因数最大,或者告知答案可以无限大,输出这个最大值。
Sol
首先拆点将点权转化为边权。
如果确定了答案 \(x\) ,若 \(u\) 到终点的距离为 \(p_u\) ,对于一条边 \((u,v,w)\),一定满足 \(p_u \equiv p_v+w(mod\quad x)\)
可知有限制的只有已知点权的点,未知点权的点可以任意赋值。
忽略未知点权的拆点,如果拆点后图为森林,若存在一条 \(1\) 到 \(n\) 的路径,答案即为其长度。若不存在答案可无穷大。
唯一的限制是图上可能有环。
设树根为 \(rt\),若新加一条边 \((u,v,w)\) 使得树上第一次出现环,那么 \(x\) 一定满足 \(p_u-p_{rt}\equiv p_v-p_{rt}+w(mod\quad x)\),即 \(|(p_u-p_{rt}-(p_v-p_{rt})-w)|\equiv0(mod \quad x)\)
那么用带权并查集维护 \(p_u-p_{rt}\) 的差值,查找到有环时令答案对上式取 \(gcd\)。若存在 \(1\) 到 \(n\) 的路径还需对其取 \(gcd\)。
Atcoder agc035e
黑板上写了 \([-10^{18},10^{18}]\) 中所有整数,每次可以选择 \([1,N]\) 其中一个还在黑板上的数 \(x\),把它擦掉并补上 \(x-2\) 和 \(x+K\)。求最终黑板上数字的可能状态有多少种。答案对 \(M\)取模。
给出 \(N(N\leq 150)\) ,\(K\) ,\(M(M\leq 10^9)\)
Sol
若 \(K\) 为偶数,分奇偶分别dp。不能选连续的 \(\frac{K}{2}\) 个删去。
若 \(K\) 为奇数,若对 \(x\rightarrow x-2\) 与 \(x\rightarrow x+K\) 连边,则删去的点不能成环。
考虑连边后图的形态。
设计 \(f_{p,i,j}\) 代表第 \(p\) 层左边选了 \(i\) 个右边选了 \(j\) 个的方案数。
CF843D
给定 \(n\) 个点 \(m\) 条边的有向带权图,\(q\) 次询问:
- 以 \(1\) 为起点到 \(v\) 的最短路
- 将 \(l_1,l_2,...,l_c\) 的边的边权都增加 \(1\)
\(1\leq n,m\leq 10^5,1\leq 1\leq 2000\)
Sol
最短路有一种复杂度为 \(O(n+m+W)\) 的做法( \(W\) 为值域)。开一个 \(W\) 的桶,从小到大扫跑dj。
对于此题可以先 \(nlogn\) 跑出无修的最短路。
再将每条边权值赋值为 \(dis_x-dis_y+c_i\)。\(dis_u\) 为最短路,\(c_i\) 为边权增加的值。
用上述方法开桶跑最短路得到的 \(dis_u'\) 为最短路的增加值且 \(dis_u'\leq n\)
CF589H
给定 \(n\) 个点 \(m\) 条边的图,指定 \(k\) 个点为关键点。
每次你可以选择两个未被选择过的在图上联通的关键点,选择它们之间的一条简单路径,将这条路径上的所有边删除。
你需要输出最多能选多少对点,并且输出每对点你删除路径长度和这条路径经过的点。
数据可达 \(5\times 10^6\)
Sol
连通块内任意生成树上一定最多只有一个点不能被匹配。

浙公网安备 33010602011771号