毕竟这也算是一个冷门的知识点了吧,所以没找到几道题 qwq
无向图三元环计数
题目:给定一张 nnn 个点 mmm 条边的无向图 GGG,问存在多少个三元组 (a,b,c)(a,b,c)(a,b,c) 满足:
* a,b,c∈Na,b,c\in\mathbb{N}a,b,c∈N。
* 1≤a<b<c≤n1\le a<b<c\le n1≤a<b<c≤n。
* (a,b),(a,c),(b,c)(a,b),(a,c),(b,c)(a,b),(a,c),(b,c) 之间都存在至少一条边。
前置定义:degu\text{deg}_udegu 表示 uuu 在图中的度数。
一般法
对于 nnn 个点的无向图 GGG 中全部的边 u↔vu\leftrightarrow vu↔v,考虑将其定向。
* 若 degu≤degv\text{deg}_u\le\text{deg}_vdegu ≤degv ,则令新图中边为 u→vu\to vu→v。
* 若 degu>degv\text{deg}_u>\text{deg}_vdegu >degv ,则令新图中边为 v→uv\to uv→u。
记新图 G′G'G′ 中 iii 点的出度为 degi′\text{deg}'_idegi′ 。
此时有一个十分优美的结论:
* 结论 1\bf11:对于图中每一个点 i(1≤i≤n)i(1\le i\le n)i(1≤i≤n),degi\text{deg}_idegi 都不超过 2m\sqrt{2m}2m 。
* 证明: 考虑到对边定向并不会让每一个点的度数增加,因此
* 若 degi≤2m\text{deg}_i\le \sqrt {2m}degi ≤2m ,则有 degi′≤degi≤2m\text{deg}'_i\le\text{deg}_i\le \sqrt {2m}degi′ ≤degi ≤2m 。
* 若 degi>2m\text{deg}_i>\sqrt {2m}degi >2m ,则根据上述的连边方式,i→ji\to ji→j 在新图中有边,当且仅当 degj≥degi>2m\text{deg}_j\ge\text{deg}_i>\sqrt {2m}degj ≥degi >2m 。因为 ∑degi=2m\sum\text{deg}_i=2m∑degi =2m,所以满足上述条件的 jjj 必不超过 2m\sqrt{2m}2m 个。于是 degi′≤2m\text{deg}'_i\le\sqrt{2m}degi′ ≤2m 。
然后考虑开始计数。考虑对于原无向图 GGG 中一个三元环 (i,j,k)(i,j,k)(i,j,k),钦定 degi≤degj≤degk\text{deg}_i\le\text{deg}_j\le\text{deg}_kdegi ≤degj ≤degk ,其在图 G′G'G′ 中必然有三条有向边 i→j,i→k,j→ki\to j,i\to k,j\to ki→j,i→k,j→k。
根据上面的结论一,对于每一个点,其出度不会超过 2m\bf\sqrt{2m}2m 。因此枚举三元环中任意一条边 i→ji\to ji→j,枚举 jjj 的出边所连接的点 kkk,只需要判断图中是否存在一条 i→ki\to ki→k 的边。可以把点对压缩为 int 类型然后哈希表判断,做到理论 O(mm)O(m\sqrt m)O(mm ) 的时间复杂度。
做到严格 O(mm)O(m\sqrt m)O(mm ):考虑对于枚举到的每一条有向边 u→vu\to vu→v,对于其中的结点 uuu,将其可以恰好一步走到的所有结点 xxx 做标记。对于此时枚举到的所有 vvv 可以一步走到的结点 www,若 www 已被标记,则 (u,v,w)(u,v,w)(u,v,w) 在图 GGG 中就是一个三元环。
上述的标记结点部分也可以通过设置时间戳来做。
坑点:
* m>105m>10^5m>105
* 排序的时候若度数相同,则需要根据点的编号大小排序
代码:
BITSET 法
考虑对于每一个点 iii,维护一个 bitset 表示 iii 点一步能走到的点组成的集合。于是三元环计数可以枚举两个点然后用 bitset 求两个集合交中 111 的个数,做到 O(n3ω)O(\frac{n^3}{\omega})O(ωn3 ),其中 ω\omegaω 取 323232。
稠密图的情况下很好用,且比普通法好写。
代码(AT_abc258_g):
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
upd 2024/11/26
无向图四元环计数
题目:给定一张 nnn 个点 mmm 条边的无向图 GGG,问存在多少个四元组 (a,b,c,d)(a,b,c,d)(a,b,c,d) 满足:
* a,b,c,d∈Na,b,c,d\in\mathbb{N}a,b,c,d∈N。
* 1≤a<b<c<d≤n1\le a<b<c<d\le n1≤a<b<c<d≤n。
* (a,b),(b,c),(c,d),(a,d)(a,b),(b,c),(c,d),(a,d)(a,b),(b,c),(c,d),(a,d) 之间都存在至少一条边。
特殊的,认为 (a,b,c,d)(a,b,c,d)(a,b,c,d) 和 (a,c,b,d)(a,c,b,d)(a,c,b,d) 是两个不同的四元环。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
还是沿用上面的做法,把所有点按照度数从小到大排序,然后按照上面的做法建立新图,并建立其的反图。 考虑枚举到图上的一个点 ddd,然后在其反图中找到一个其可以一次到达的结点 aaa。现在只需要找到有多少组合法的四元组 (a,×,×,d)(a,\times,\times,d)(a,×,×,d) 满足其形成了一个四元环。
考虑枚举 aaa 新图中所有可以一步到达的结点 bbb,若 bbb 可以在新图中一次走到 ddd,则将其放入点集 VVV 中。最终上述合法的四元环中两个 ×\times× 只需要在点集 VVV 中任取两个点 u,vu,vu,v 即可。
和上面的分析相似,时间复杂度还是 O(mm)O(m\sqrt m)O(mm )。
例题
1. CF GYM 102028L CONNECTED SUBGRAPHS\BOLDSYMBOL{1.\ CF\ GYM\ 102028L\ CONNECTED\ SUBGRAPHS}1. CF GYM 102028L CONNECTED SUBGRAPHS
(不是为什么我刚学图上计数就开这么折磨的题啊)
题意:给定一张 nnn 个点 mmm 条边的无向图,问有多少种不同的选取四条边的方法,使得这四条边生成的导出子图连通。
数据范围:4≤n≤105,4≤m≤2×1054\le n\le 10^5,4\le m\le 2\times 10^54≤n≤105,4≤m≤2×105。
题解:
考虑分类讨论。发现上述选取的方案若合法则必然生成
* 四元环
* 三元环外加一个点
* 菊花(十字)
* 五个点的链
* 四个点的链外加一个点
容易发现五种情况的并集恰好为全集,且两两的交为空。因此只需要分别计算五种情况的答案并求和即可。
(1) 四元环
直接套四元环计数的板子即可。
(2) 三元环外加一个点
考虑继续沿用计算三元环的做法。因为三元环的每一个结点均与另两个结点有连边,且做三元环计数的时候枚举了每一个合法的三元环,因此考虑对于每一个三元环 (a,b,c)(a,b,c)(a,b,c),若选择其中一个点并外接一条边,不同的方案数为 dega+degb+degc−6\text{deg}_a+\text{deg}_b+\text{deg}_c-6dega +degb +degc −6。将所有这样的贡献相加即可得到这部分的答案。
(3) 菊花(十字)
考虑枚举菊花的重心结点 uuu,则该点对答案的贡献为 (degu4)\binom{\text{deg}_u}{4}(4degu )。将所有这样的贡献求和即可得到这部分的答案。
(4) 四个点的链外加一个点
考虑先枚举该形态的两个顶点 x,yx,yx,y 满足 degx=2,degy=3\text{deg}_x=2,\text{deg}_y=3degx =2,degy =3。然后考虑找到 xxx 一步可以走到的结点和 yyy 一步可以走到的结点。此时对答案的贡献为 (degx−1)×(degy−12)(\text{deg}_x-1)\times\binom{\text{deg}_y-1}{2}(degx −1)×(2degy −1 )。
但是这显然是错的,因为 xxx 和 yyy 可能会有共同的可以走到的结点。于是考虑对答案容斥。考虑到 yyy 枚举的一步可以走到的两个结点互不相同,因此只有可能是 xxx 一步走到的结点和 yyy 一步走到的结点之间出现了重复,共有 222 种情况。然后可以发现若重复则变为“三元环外加一个点”的情况,因此减去两倍第二类情况的答案即可。
(5) 五个点的链
考虑枚举链的重心结点 xxx,于是只需要枚举和 xxx 有边相连的两个结点 y,zy,zy,z 满足 y≠zy\neq zy=z。考虑到 y,zy,zy,z 两个点相邻的点已经被 xxx 所占用了一个,因此对答案的贡献就是 (degy−1)×(degz−1)(\text{deg}_y-1)\times(\text{deg}_z-1)(degy −1)×(degz −1)。但是同样的,可能会出现选择的点重复的情况,则同样考虑容斥。
令 y′y'y′ 表示 yyy 向外连的点,z′z'z′ 表示 zzz 向外连的点。
* yyy 和 z′z'z′ 重合,且 y′y'y′ 和 zzz 也重合。此时剩余的三个点 x,y,zx,y,zx,y,z 恰好构成了图的一个三元环。直接在图上跑三元环计数即可。
* y′y'y′ 和 zzz 重合,但是 yyy 和 z′z'z′ 不重合。此时剩下的四个点 x,y,z,z′x,y,z,z'x,y,z,z′ 构成了三元环上外加一个结点的情况,已在前面讨论。
* yyy 和 z′z'z′ 重合,但是 y′y'y′ 和 zzz 不重合。此时剩下的四个点 x,y,y′,zx,y,y',zx,y,y′,z 构成了三元环上外加一个结点的情况,已在前面讨论。
* y′y'y′ 和 z′z'z′ 重合。此时剩下的四个点 x,y,z,z′x,y,z,z'x,y,z,z′ 构成了一个四元环,直接在图上跑四元环计数即可。
于是讨论完了这题的所有情况。
加强版:FJWC2019 子图,但是我没找到能提交这个题的地方 qwq
代码:
(甚至是最劣解)
2. HDU 6184 COUNTING STARS\BOLDSYMBOL{2.\ HDU\ 6184\ COUNTING\ STARS}2. HDU 6184 COUNTING STARS
题意:给定一张 nnn 个点 mmm 条边的无向图 GGG,问可以在其中找到多少个下面的图形:
数据范围:1≤n≤3×105,∑n≤6×1051\le n\le 3\times 10^5,\sum n\le 6\times 10^51≤n≤3×105,∑n≤6×105。
题解:
基础题。
考虑到计数三元环的时候是枚举了每一个三元环的,因此考虑先枚举每一个三元环,然后对每一条边记录有多少个三元环使用了该边。设有 aia_iai 个三元环使用了 iii 边,则对答案的贡献是 (ai2)\binom{a_i}{2}(2ai )。将所有的贡献相加即可得到答案。
代码:
不知道为什么 MLE 了,我寻思我只用了 7MB 的内存啊/yiw
3. QOJ6534, UM_NIK MOD 998 244 353 CONTEST K 4\BOLDSYMBOL{3.\ QOJ 6534,\ UM\_NIK\ MOD\ 998\ 244\ 353\ CONTEST\ K\ 4}3. QOJ6534, UM_NIK MOD 998 244 353 CONTEST K 4
题意:给定一张 nnn 个点 mmm 条边的无向图 GGG,问其有多少个子图是 K4K_4K4 。
数据范围:4≤n≤1054\le n\le 10^54≤n≤105,0≤m≤1050\le m\le 10^50≤m≤105。
题解:考虑枚举 K4K_4K4 中任意一个结点 iii,问题变为计数有多少个三元环都和 iii 结点有边相连。
然后把图上所有的边都定向,使用 bitset 对 iii 的所有出度可以通往的结点做三元环计数即可。
时间复杂度为什么是对的?证明:考虑令 iii 在定向后图的出度为 degi≤2m\text{deg}_i\le\sqrt{2m}degi ≤2m ,视作 O(m)O(\sqrt m)O(m ) 级别。然后对这 degi\text{deg}_idegi 个点做 bitset 三元环计数,时间复杂度为 O(degi3ω)O(\frac{{\text{deg}_i}^3}{\omega})O(ωdegi 3 ),其中 ω\omegaω 取 323232。
为了让 degi\text{deg}_idegi 尽量大,所以钦定 degi≈O(m)\text{deg}_i\approx O(\sqrt m)degi ≈O(m )。又因为 ∑i=1ndegi=2m≈O(m)\sum\limits_{i=1}^n\text{deg}_i=2m\approx O(m)i=1∑n degi =2m≈O(m),因此此时不同的 iii 的数量为 O(m)O(\sqrt m)O(m ) 级别。
总时间复杂度即为 O(m×m32ω)=O(m2ω)O(\sqrt m\times \frac{m^\frac{3}{2}}{\omega})=O(\frac{m^2}{\omega})O(m ×ωm23 )=O(ωm2 ),可以通过本题。
代码:
4. P3547 [POI2013] CEN−PRICE LIST\BOLDSYMBOL{4.\ P3547\ [POI2013]\ CEN-PRICE\ LIST}4. P3547 [POI2013] CEN−PRICE LIST
题意:给定一张 nnn 个点 mmm 条边的无向图 GGG,初始每一条边边权都为 aaa。然后对于任意两个点 x,yx,yx,y,若 x→yx\to yx→y 的最短路长度恰好为 2a2a2a,则再加一条 x→yx\to yx→y,边权为 bbb 的无向边。问在这张新的图中,kkk 点到其他每一个点的最短路长度是多少。
数据范围:n,m≤105n,m\le10^5n,m≤105,1≤a,b≤10001\le a,b\le 10001≤a,b≤1000。保证最后得到的新图连通。
题解:
容易发现为了让路径长度最短,有且仅可能有下面的三种情况:
* 全走长度为 aaa 的边(111)
* 在原最短路上将相邻两条边替换为长度为 bbb 的边,剩下的走长度为 aaa 的边(222)
* 全走长度为 bbb 的边(333)
首先 (1),(2)(1),(2)(1),(2) 两种情况可以一遍 dijkstra 或者直接广搜跑出来,问题在于 (3)(3)(3) 情况。
考虑枚举任意两条边 x→yx\to yx→y,y→zy\to zy→z,可以在 x→zx\to zx→z 之间添加一条长度为 bbb 的边。但是这样是 O(m2)O(m^2)O(m2) 的,十分的不优秀。
考虑这样的一个结论:
> 结论:对于三个点 x,y,zx,y,zx,y,z,定义 disi\text{dis}_idisi 表示从起点到 iii 点的最短路的长度,则若 x→yx\to yx→y 和 y→zy\to zy→z 两条边边权的和大于或等于 x→zx\to zx→z 这条边边权,且 x,y,zx,y,zx,y,z 三个点不两两之间有边,则可以直接删去 y→zy\to zy→z 这条边。
感性理解容易发现结论正确。然后考虑到 x,y,zx,y,zx,y,z 三个点两两有边则 (x,y,z)(x,y,z)(x,y,z) 为图的一个三元环。考虑下一个性质:
> nnn 个点 mmm 条边,无重边和自环的无向图,三元环数量量级不会超过 O(mm)O(m\sqrt m)O(mm )。
证明:考虑三元环将边定向后得到的新有向图 G′G'G′,每一个点的出度都不超过 2m≈O(m)\sqrt{2m}\approx O(\sqrt m)2m ≈O(m )。考虑枚举三元环中的一条边,然后枚举该边中某一个顶点可以一步走到的顶点,这样的顶点数量级是不会超过 O(m)O(\sqrt m)O(m ) 的。又因为新图也有 mmm 条有向边,所以合法的三元环数量为 O(mm)O(m\sqrt m)O(mm ) 级别。
于是直接在松弛的时候删边,对三元环的情况特判。还剩下 O(mm)O(m\sqrt m)O(mm ) 条边。对于这张图再跑最短路,因为边权相同所以可以直接广搜,时间复杂度为 O(mm)O(m\sqrt m)O(mm ) 可以通过。
代码:
vector 存图想要删除某一个元素,若具体顺序不重要,则可以先把这个元素和末尾元素交换,然后再删除末尾元素,做到 O(1)O(1)O(1) 删除任意元素。
5. CF1468M SIMILAR SETS\BOLDSYMBOL{5.\ CF1468M\ SIMILAR\ SETS}5. CF1468M SIMILAR SETS
题意:给定 nnn 个序列 aia_iai ,同一序列中元素两两不同,问是否可以在其中找出两个序列满足它们至少有两个相同的元素。不需要计数。
数据范围:1≤n≤105,1≤ai,j≤2×109,∑∣ai∣≤2×1051\le n\le 10^5,1\le a_{i,j}\le 2\times 10^9,\sum|a_i|\le 2\times 10^51≤n≤105,1≤ai,j ≤2×109,∑∣ai ∣≤2×105。
题解:
貌似是另一种套路?
考虑建图。先对序列离散化,然后将每一个序列中的元素向对应的序列连边。此时若找到任意一组四元环 (i,j,k,l)(i,j,k,l)(i,j,k,l),一定可以被循环移位直到该四元环为“元素-序列-元素-序列”的形式。
然后问题就解决了。时间复杂度为 O(mm)O(m\sqrt m)O(mm )。这里 mmm 表示建出来的图的边数。
代码:
6. CF985G TEAM PLAYERS\BOLDSYMBOL{6.\ CF985G\ TEAM\ PLAYERS}6. CF985G TEAM PLAYERS
题意:
有一张 nnn 个点 mmm 条边的图,点的编号从 000 开始。求下列表达式的值:
∑i=0n−1∑j=i+1n−1∑k=j+1n−1[(i,j,k)三个点之间互相没有边相连](Ai+Bj+Ck)\sum\limits_{i=0}^{n-1}\sum\limits_{j=i+1}^{n-1}\sum\limits_{k=j+1}^{n-1} [(i,j,k)三个点之间互相没有边相连](Ai+Bj+Ck) i=0∑n−1 j=i+1∑n−1 k=j+1∑n−1 [(i,j,k)三个点之间互相没有边相连](Ai+Bj+Ck)
其中 [expr][expr][expr] 为艾弗森括号,若 exprexprexpr 这个布尔表达式为真则值为 111,否则为 000。如:[T_TLucas_Yin 是可爱班花] 因括号内表达式为真所以答案为 111,其反命题的值则为 000(不是)
数据范围:3≤n≤200000,0≤m≤2000003\le n\le 200000,0\le m\le 2000003≤n≤200000,0≤m≤200000。
题解:
首先如果要对两两之间有边的情况计数则相对简单,直接计数三元环然后对于每一个三元环计算其贡献。但是问题要对两两之间无边计数。建立反图可以解决这个问题但是反图边数是 O(n2)O(n^2)O(n2) 级别的,显然不行。
于是套路的考虑容斥答案。这样需要计数:
* 图中所有三元组对答案的贡献。容斥系数为 111。
* 图中所有三元环对答案的贡献。容斥系数为 −1-1−1。
* 图中所有三元组满足其中有两对点对有边另一对点对无边对答案的贡献。容斥系数为 111。
* 图中所有三元组满足其中有一对点对有边另一对点对无边对答案的贡献。容斥系数为 −1-1−1。
将上述部分的答案和容斥系数相乘后求和变为答案。问题是计算上述四个问题的答案。
(1) 所有三元组对答案的贡献
此时和图的形态无关,式子为:
∑i=0n−1∑j=i+1n−1∑k=j+1n−1(Ai+Bj+Ck)\sum\limits_{i=0}^{n-1} \sum\limits_{j=i+1}^{n-1} \sum\limits_{k=j+1}^{n-1} (Ai+Bj+Ck) i=0∑n−1 j=i+1∑n−1 k=j+1∑n−1 (Ai+Bj+Ck)
考虑到最后的柿子 Ai+Bj+CkAi+Bj+CkAi+Bj+Ck 中 A,B,CA,B,CA,B,C 三个元素两两独立,因此考虑分开计算 A,B,CA,B,CA,B,C 对答案的贡献。
1. AAA 部分对答案的贡献
考虑抽离出和 AAA 有关的部分:
∑i=0n−1∑j=i+1n−1∑k=j+1n−1Ai\sum\limits_{i=0}^{n-1} \sum\limits_{j=i+1}^{n-1} \sum\limits_{k=j+1}^{n-1} Ai i=0∑n−1 j=i+1∑n−1 k=j+1∑n−1 Ai
发现 j,kj,kj,k 的值都和最后答案的值没有关系,只需要考虑对于每一个 iii,有多少种不同的合法的二元组 (j,k)(j,k)(j,k) 对答案存在贡献。容易发现 iii 固定下上述合法的二元组数量是 (n−i+1)×(n−i)2\frac{(n-i+1)\times(n-i)}{2}2(n−i+1)×(n−i) ,因此实际的贡献为:
A×∑i=0n−1(i×(n−i+1)×(n−i)2)A\times \sum\limits_{i=0}^{n-1}(i\times\frac{(n-i+1)\times(n-i)}{2}) A×i=0∑n−1 (i×2(n−i+1)×(n−i) )
可以直接计数。
2. BBB 部分对答案的贡献
考虑抽离出和 BBB 有关的部分:
∑i=0n−1∑j=i+1n−1∑k=j+1n−1Bj\sum\limits_{i=0}^{n-1}\sum\limits_{j=i+1}^{n-1}\sum\limits_{k=j+1}^{n-1}Bj i=0∑n−1 j=i+1∑n−1 k=j+1∑n−1 Bj
发现该表达式和 i,ji,ji,j 的值均有关系。因此考虑经典套路交换求和顺序,得到
∑j=0n−1∑i=0j−1∑k=j+1n−1Bj\sum\limits_{j=0}^{n-1}\sum\limits_{i=0}^{j-1}\sum\limits_{k=j+1}^{n-1} Bj j=0∑n−1 i=0∑j−1 k=j+1∑n−1 Bj
此时式子只和 jjj 的值强相关,因此考虑固定 jjj 计数合法的二元组 (i,k)(i,k)(i,k) 的数量。容易发现答案为
B×∑j=0n−1(j×j×(n−j−1))=B×∑j=0n−1(j×(n−j−1))B\times \sum\limits_{j=0}^{n-1}(j\times j\times (n-j-1))=B\times\sum\limits_{j=0}^{n-1}(j\times (n-j-1)) B×j=0∑n−1 (j×j×(n−j−1))=B×j=0∑n−1 (j×(n−j−1))
也可以直接计数。
3. CCC 部分对答案的贡献
和 BBB 部分相似的,交换求和顺序然后计数 (i,j)(i,j)(i,j) 二元组对答案的贡献。答案为
C×∑k=0n−1k×(k−1)2C\times \sum\limits_{k=0}^{n-1}\frac{k\times(k-1)}{2} C×k=0∑n−1 2k×(k−1)
还是可以直接计数。
(2) 三元环对答案的贡献
考虑到做三元环计数的时候其实是枚举到了每一个三元环的,因此直接对于每一个三元环计算其对答案的贡献即可。
(3) 所有三元组满足其中有一对点对有边另两对点对无边对答案的贡献
考虑枚举该三元组中的一条边 u→vu\to vu→v,这里钦定 u<vu<vu<v。(显然 u≠vu\neq vu=v。)以及三元组为 (x,y,z)(x,y,z)(x,y,z)(1≤x<y<z≤n1\le x<y<z\le n1≤x<y<z≤n)。考虑分讨环上另一个元素 www 的下标对答案的影响:
* x=ux=ux=u,此时为了让三元组合法,需要满足 w>xw>xw>x。因此此时对答案的贡献为 Ax(n−x−2)Ax(n-x-2)Ax(n−x−2)。
* y=uy=uy=u。此时为了让三元组合法,需要满足 w<xw<xw<x。因此此时对答案的贡献为 Bx2Bx^2Bx2。
* y=vy=vy=v。此时为了让三元组合法,需要满足 w>yw>yw>y。因此此时对答案的贡献为 By(n−y−1)By(n-y-1)By(n−y−1)。
* z=vz=vz=v。此时为了让三元组合法,需要满足 w<yw<yw<y。因此此时对答案的贡献为 Cy(y−1)Cy(y-1)Cy(y−1)。
* x=wx=wx=w。此时为了让三元组合法,需要满足 w∈[0,u)w\in[0,u)w∈[0,u),有 uuu 个不同的合法取值。因此此时对答案的贡献为 A×x(x−1)2A\times\frac{x(x-1)}{2}A×2x(x−1) 。
* y=wy=wy=w。此时为了让三元组合法,需要满足 w∈(u,v)w\in(u,v)w∈(u,v),有 v−u−1v-u-1v−u−1 个不同的合法取值。因此此时对答案的贡献为 B×(v−u−1)(u+v)2B\times\frac{(v-u-1)(u+v)}{2}B×2(v−u−1)(u+v) 。
* z=wz=wz=w。此时为了让三元组合法,需要满足 w∈(v,n)w\in(v,n)w∈(v,n),有 n−v−1n-v-1n−v−1 个不同的合法取值。因此此时对答案的贡献为 C×(n+v)(n−v−1)2C\times\frac{(n+v)(n-v-1)}{2}C×2(n+v)(n−v−1) 。
只需要将上述七种情况的答案求和即可。
(4) 所有三元组满足其中有两对点对有边另一对点对无边对答案的贡献
最困难的一集
考虑枚举在这个大小为 333 的生成子图中度数为 222 的点 uuu,以及其可以一步走到的点 vvv,另一个没有提到的结点为 www。这里令 uuu 可以一步到达的结点的数目为 ccc,vvv 点在其中排名为 ppp。u→vu\to vu→v 这条边对答案的贡献可以分为 uuu 对答案的贡献和 vvv 对答案的贡献。
一、uuu 对答案的贡献
钦定三元组为 (x,y,z)(x,y,z)(x,y,z) 且满足 1≤x<y<z≤n1\le x<y<z\le n1≤x<y<z≤n,则:
* x=ux=ux=u。此时必有 u<v,w<nu<v,w<nu<v,w<n,因此对答案的贡献为 A×u×(c−p)(c−p−1)2A\times u\times \frac{(c-p)(c-p-1)}{2}A×u×2(c−p)(c−p−1) 。
* y=uy=uy=u。此时 v,wv,wv,w 和 uuu 的大小关系必然是一个小一个大。因此对答案的贡献为 B×u×(p−1)×(c−p)B\times u\times(p-1)\times(c-p)B×u×(p−1)×(c−p)。
* z=uz=uz=u。此时必有 0≤v,w<u0\le v,w<u0≤v,w<u,因此对答案的贡献为 C×u×p×(p−1)2C\times u\times \frac{p\times(p-1)}{2}C×u×2p×(p−1) 。
将上述三种情况的贡献求和即可得到 uuu 对答案的贡献。
二、vvv 对答案的贡献
考虑对 u,vu,vu,v 的大小关系进行分类讨论。容易发现 u≠vu\neq vu=v。
u<vu<vu<v:需要继续分类讨论 www 和 vvv 的大小关系:
* w<vw<vw<v,则 vvv 对答案的贡献为 Cv(p−2)Cv(p-2)Cv(p−2)。
* w>vw>vw>v,则 vvv 对答案的贡献为 Bv(c−p)Bv(c-p)Bv(c−p)。
* w=vw=vw=v。容易发现此情况不存在。
否则即 u>vu>vu>v。同样需要继续分类讨论 www 和 vvv 的大小关系:
* w<vw<vw<v,则 vvv 对答案的贡献为 Bv(p−1)Bv(p-1)Bv(p−1)。
* w>vw>vw>v,则 vvv 对答案的贡献为 Av(c−i−1)Av(c-i-1)Av(c−i−1)。
* w=vw=vw=v。容易发现此情况不存在。
于是将上述几种情况相加就得到了该类情况对答案的贡献。
于是这个 duliu 题就被做完了。
代码:
题解区里代码对于最后一种情况的处理十分简洁,于是学习了一下。
上为使用数组,下为是使用 vector。警示后人,不要乱用 vector。
upd:调过了,更新一下代码。
7. CF GYM 104651C CLIQUE CHALLENGE\BOLDSYMBOL{7.\ CF\ GYM\ 104651C\ CLIQUE\ CHALLENGE}7. CF GYM 104651C CLIQUE CHALLENGE
题意:给定一个 nnn 个点 mmm 条边的无向图,问该图团的数量。
数据范围:1≤n≤10001\le n\le 10001≤n≤1000,1≤m≤10001\le m\le 10001≤m≤1000。
题解:
仍然考虑求三元环时的定向方法,让度数小的点连向度数大的点,形成一张新的有向图。此时每一个点的出度不超过 2m\sqrt{2m}2m 。
然后考虑枚举点 uuu,并钦定点 uuu 是团中的点,且在新图中不存在任何点能够到达 uuu。根据团的性质此时其余的点都必然可以从 uuu 开始在新图中通过恰好一条边到达。又因为新图的性质,满足这样条件的点不会超过 2m<45\sqrt{2m}<452m <45 个。考虑对这些点进行折半求出可以组成的团的数目,于是这个题就做完了。
时间复杂度证明:显然为了让时间复杂度最大,让新图中点的出度的最大值为 2m\sqrt{2m}2m 最优。此时最多可以得到 O(m)O(\sqrt m)O(m ) 个这样的点。又因为折半搜索时间复杂度为 O(22m2)O(2^{\frac{\sqrt{2m}}{2}})O(222m ),因此总的时间复杂度为 O(m×22m2)O(\sqrt m\times 2^\frac{\sqrt{2m}}{2})O(m ×222m ) 可以通过。
代码:
8. CF11D A SIMPLE TASK\BOLDSYMBOL{8.\ CF11D\ A\ SIMPLE\ TASK}8. CF11D A SIMPLE TASK
题意:给定一张 nnn 个点 mmm 条边的无向图,求该图中简单环的数量。
数据范围:1≤n≤191\le n\le 191≤n≤19,m≥0m\ge 0m≥0,图无重边自环。
题解:
这个好像没有什么特别优秀的解法……考虑到 n≤19n\le 19n≤19 而 219<1062^{19}<10^6219<106,看上去十分的状压。
于是设 fi,jf_{i,j}fi,j 表示当前选择了 iii 集合内的点,当前位于 jjj 点的方案数。这里钦定该环的起点为 lowbit(i)\text{lowbit}(i)lowbit(i)。转移是容易的。于是这个问题就做完了。
写代码的话需要注意一下一个环会被正着计数一遍然后再被反着计数一遍,答案需要除以 222。
代码:
9. [PA2009] CAKES\BOLDSYMBOL{9.\ [PA2009]\ CAKES}9. [PA2009] CAKES
题意:给定一张 nnn 个点 mmm 条边的无向图,点有点权。定义三元组 (i,j,k)(i,j,k)(i,j,k) 的贡献是 max(ai,aj,ak)\max(a_i,a_j,a_k)max(ai ,aj ,ak )。问所有三元环 (i,j,k)(i,j,k)(i,j,k) 满足 i<j<ki<j<ki<j<k 对答案的贡献的和是多少。
数据范围:n<105,m<2.5×105n<10^5,m<2.5\times 10^5n<105,m<2.5×105。
题解:
板子题。考虑到做三元环计数的时候具体枚举到了每一个三元环,所以直接对每一个三元环处理其贡献即可。时间复杂度为 O(mm)O(m\sqrt m)O(mm )。
代码:
10. CF GYM 100342J TRIATRIP\BOLDSYMBOL{10.\ CF\ GYM\ 100342J\ TRIATRIP}10. CF GYM 100342J TRIATRIP
题意:给定一张有向稠密图 GGG,nnn 个点 mmm 条边,问图中有多少个三元环。
数据范围:3≤n≤15003\le n\le 15003≤n≤1500,m≤n2−nm\le n^2-nm≤n2−n。
题解:有向图无法使用给边定向,但是发现 nnn 十分小,因此考虑 bitset 做法。
记录第一个 bitset:FiF_iFi 表示 iii 可以一步到达的结点组成的集合。
记录第二个 bitset:GiG_iGi 表示可以一步到达 iii 的结点组成的集合。
然后考虑枚举三元环中的两个结点 i,ji,ji,j,钦定边的方向为 i→ji\to ji→j。只需要统计 kkk 的数量满足 iii 可以被 kkk 一步到达,且 jjj 可以一步到达 kkk。答案即为 GiG_iGi 和 FjF_jFj 两个 bitset 的交集的大小。直接这样做时间复杂度为 O(n3ω)O(\frac{n^3}{\omega})O(ωn3 ),可以通过该题。
注意点:
1. bitset 有向图会把三元环重复计算 333 遍,而无向图中是 666 遍。
2. 需要开文件读写! 输入文件名为 triatrip.in,输出文件名为 triatrip.out。
代码:
11. 某场 NOIP 模拟赛的 T1 实力\BOLDSYMBOL{11.\ 某场\ NOIP\ 模拟赛的\ T1\ 实力}11. 某场 NOIP 模拟赛的 T1 实力
题意:给定整数 nnn,要求构造一张无向简单图,满足结点数 nnn 不超过 500500500,且恰有 mmm 个本质不同的三元环。
数据范围:1≤m≤2×1061\le m\le 2\times 10^61≤m≤2×106。
题解:简单构造。考虑下列性质:一张 nnn 个点的完全图恰有 (n3)\binom{n}{3}(3n ) 个本质不同的三元环。
证明:考虑到任选三个点 i,j,ki,j,ki,j,k(i<j<ki<j<ki<j<k)它们之间都两两有边相连,且任意两组点对都本质不同。显然这样的数对 (i,j,k)(i,j,k)(i,j,k) 的数量为 (n3)\binom{n}{3}(3n )。因此得证。
所以说考虑构造若干个完全图然后拼凑出 mmm。这个可以贪心的让完全图的大小在保证三元环数目之和不超过 mmm 的前提下尽量的大。直接做打表可以得到三元环数目远远不到 500500500 个,可以通过。
代码:
12. P4619 [SDOI2018] 旧试题\BOLDSYMBOL{12.\ P4619\ [SDOI2018]\ 旧试题}12. P4619 [SDOI2018] 旧试题
题意:求
∑i=1A∑j=1B∑k=1Cd(ijk)\sum\limits_{i=1}^A\sum\limits_{j=1}^B\sum\limits_{k=1}^C d(ijk) i=1∑A j=1∑B k=1∑C d(ijk)
对 109+710^9+7109+7 取模后的结果。
数据范围:101010 组数据,1≤A.B.C≤1051\le A.B.C\le 10^51≤A.B.C≤105,5s\bf{5s}5s。
题解:
神奇反演+三元环计数题,去年noip刚学三元环计数的时候就在题单里了。首先有经典公式 d(ijk)=∑x∣i∑y∣j∑z∣kϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))d(ijk)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}\sum\limits_{z\mid k}\epsilon(\gcd(x,y))\epsilon(\gcd(x,z))\epsilon(\gcd(y,z))d(ijk)=x∣i∑ y∣j∑ z∣k∑ ϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z)),因此可以开始推柿子:
∑i=1A∑j=1B∑k=1Cd(ijk)=∑i=1A∑j=1B∑k=1C∑x∣i∑y∣j∑z∣kϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))=∑x=1A∑i=1⌊Ax⌋∑y=1B∑j=1⌊By⌋∑z=1C∑j=1⌊Cz⌋ϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))=∑x=1A∑y=1B∑z=1Cϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))⌊Ax⌋⌊By⌋⌊Cz⌋=∑x=1A∑y=1B∑z=1C⌊Ax⌋⌊By⌋⌊Cz⌋∑a∣x∧a∣yμ(a)∑b∣x∧b∣yμ(b)∑c∣x∧c∣yμ(c)=∑a=1min(A,B)∑b=1min(A,C)∑c=1min(B,C)μ(a)μ(b)μ(c)∑lcm(a,b)∣x⌊Ax⌋∑lcm(a,c)∣y⌊By⌋∑lcm(b,c)∣z⌊Cz⌋\newcommand\sm{\sum\limits_}
\begin{aligned} &\sm{i=1}^A\sm{j=1}^B\sm{k=1}^Cd(ijk)\\ =&\sm{i=1}^A\sm{j=1}^B\sm{k=1}^C\sm{x\mid i}\sm{y\mid j}\sm{z\mid k}\epsilon(\gcd(x,y))\epsilon(\gcd(x,z))\epsilon(\gcd(y,z))\\ =&\sm{x=1}^A\sm{i=1}^{\lfloor\frac A{x}\rfloor}\sm{y=1}^B\sm{j=1}^{\lfloor\frac
B{y}\rfloor}\sm{z=1}^C\sm{j=1}^{\lfloor\frac C{z}\rfloor}\epsilon(\gcd(x,y))\epsilon(\gcd(x,z))\epsilon(\gcd(y,z))\\ =&\sm{x=1}^A\sm{y=1}^B\sm{z=1}^C\epsilon(\gcd(x,y))\epsilon(\gcd(x,z))\epsilon(\gcd(y,z))\lfloor\frac Ax\rfloor\lfloor\frac By\rfloor\lfloor\frac Cz\rfloor\\
=&\sm{x=1}^A\sm{y=1}^B\sm{z=1}^C\lfloor\frac Ax\rfloor\lfloor\frac By\rfloor\lfloor\frac Cz\rfloor\sm{a\mid x\land a\mid y}\mu(a)\sm{b\mid x\land b\mid y}\mu(b)\sm{c\mid x\land c\mid y}\mu(c)\\
=&\sm{a=1}^{\min(A,B)}\sm{b=1}^{\min(A,C)}\sm{c=1}^{\min(B,C)}\mu(a)\mu(b)\mu(c)\sm{\operatorname{lcm}(a,b)\mid x}\lfloor\frac Ax\rfloor\sm{\operatorname{lcm}(a,c)\mid y}\lfloor\frac By\rfloor\sm{\operatorname{lcm}(b,c)\mid z}\lfloor\frac Cz\rfloor \end{aligned} ===== i=1∑A j=1∑B k=1∑C d(ijk)i=1∑A
j=1∑B k=1∑C x∣i∑ y∣j∑ z∣k∑ ϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))x=1∑A i=1∑⌊xA ⌋ y=1∑B j=1∑⌊yB ⌋ z=1∑C j=1∑⌊zC ⌋ ϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))x=1∑A y=1∑B z=1∑C ϵ(gcd(x,y))ϵ(gcd(x,z))ϵ(gcd(y,z))⌊xA ⌋⌊yB ⌋⌊zC ⌋x=1∑A y=1∑B z=1∑C ⌊xA ⌋⌊yB ⌋⌊zC ⌋a∣x∧a∣y∑ μ(a)b∣x∧b∣y∑ μ(b)c∣x∧c∣y∑ μ(c)a=1∑min(A,B)
b=1∑min(A,C) c=1∑min(B,C) μ(a)μ(b)μ(c)lcm(a,b)∣x∑ ⌊xA ⌋lcm(a,c)∣y∑ ⌊yB ⌋lcm(b,c)∣z∑ ⌊zC ⌋
后半部分的 ∑lcm(a,b)∣x⌊Ax⌋∑lcm(a,c)∣y⌊By⌋∑lcm(b,c)∣z⌊Cz⌋\newcommand\sm{\sum\limits_}\sm{\operatorname{lcm}(a,b)\mid x}\lfloor\frac Ax\rfloor\sm{\operatorname{lcm}(a,c)\mid y}\lfloor\frac By\rfloor\sm{\operatorname{lcm}(b,c)\mid z}\lfloor\frac Cz\rfloorlcm(a,b)∣x∑ ⌊xA ⌋lcm(a,c)∣y∑ ⌊yB ⌋lcm(b,c)∣z∑ ⌊zC
⌋ 可以分别预处理后 O(1)O(1)O(1) 查询,因此此时直接做时间复杂度为 O(n3)O(n^3)O(n3)。考虑优化。容易发现两点 i,ji,ji,j 之间可能发生转移当且仅当 μ(i)≠0∧μ(j)≠0∧lcm(i,j)≤max(A,B,C)\mu(i)\neq 0\land \mu(j)\neq 0\land \text{lcm}(i,j)\le\max(A,B,C)μ(i)=0∧μ(j)=0∧lcm(i,j)≤max(A,B,C)。为了不重不漏的计数考虑枚举 i,ji,ji,j 的公约数 ggg,同时满足
gcd(i,j)=1,i×j×g≤max(a,b,c)\gcd(i,j)=1,i\times j\times g\le\max(a,b,c)gcd(i,j)=1,i×j×g≤max(a,b,c) 然后给 i,ji,ji,j 建一条双向边。打个表发现在 a=b=c=105a=b=c=10^5a=b=c=105 时边数也只有 760741760741760741 条。然后考虑用这个图来优化上面的莫反柿子,可以想到上面中每一个对答案有贡献的三元组 (a,b,c)(a,b,c)(a,b,c) 在图上就是一个三元环,直接搞三元环计数即可。但是由于这里没法处理
a=b,a=c,b=ca=b,a=c,b=ca=b,a=c,b=c 和 a=b=ca=b=ca=b=c 的情况,所以暴力算出上面两种情况再累加到答案中即可。
总时间复杂度为 O(Tmm)O(Tm\sqrt m)O(Tmm ),其中 mmm 为边数 ≤760741\le 760741≤760741,卡常后可以通过。
有向图三元环计数的另解
考虑对有向图 GGG,将其中所有的有向边均建立反边,得到无向图 G′G'G′。
容易证明若 (x,y,z)(x,y,z)(x,y,z) 在 GGG 中是合法的三元环,则在 G′G'G′ 中也为合法的三元环。
因此只需要在新图 G′G'G′ 中跑三元环计数,然后对于得到的每一个三元环,暴力判断其在有向图 GGG 中是否也是三元环即可。时间复杂度同样也是 O(mm)O(m\sqrt m)O(mm )。