图 / 树上计数
团计数
挑战 #P-Complete (bushi
有好几种做法。
枚举 + 折半 + 高维前缀和
应该要预处理邻域,状压一下。
考虑枚举编号最小的点 \(i\),把剩下的 \(n-i\) 个点均分为 \(A\) 和 \(B\) 集合,分别用 \(O(2^{|S|})\) 的搜索搞出来所有的团。
考虑 \(A\) 中的团 \(C_A\) 和 \(B\) 中的团 \(C_B\) 能合并,当且仅当 \(C_A\) 内所有点的邻域交与 \(B\) 的交包含了 \(C_B\)。于是这是一个子集和。
这里可以做到 \(O(n2^{\frac{n}{2}})\)。
上面那种去掉高维前缀和
如果有高维前缀和的话那复杂度是降不下来的。
考虑直接状压 DP。设 \(f_S\) 表示 \(S\) 中团的个数。设 \(u\in S\),\(T_u\) 为 \(u\) 在 \(S\) 中的邻域,那么如果 \(u\) 不在团中,从 \(f_{S\setminus \{u\}}\) 转移;否则从 \(f_{T_u}+1\) 转移。
这样就是 \(O(2^{\frac{n}{2}})\) 的。
稀疏图上的特殊做法
用边数去限制。发现团的限制强劲,很可能可以有根号的东西出来。
考虑在一个团中度数最小且编号最小的点处统计这个团。发现保留下来的边至多为 \(\sqrt{2m}\)。这个可以简单根号分治。
然后折半搜索,类似上面两个的合并。可以做到 \(O(2^{\frac{\sqrt{2m}}{2}}\sqrt m)\)。或许用第二种合并方式可以达到 \(O(2^{\frac{\sqrt{2m}}{2}})\)。
树上拓扑序计数
这个是很多题转化的方向。
一般 DAG 上的拓扑序计数是 NP 的,可以状压。
这里默认是根向树。
有很显然的子结构:把根去掉之后变成独立的森林,只需合并序列即可。
可以 DP。设 \(f_u\) 表示 \(u\) 子树内的拓扑序数量。
转移就观察子结构,只需把独立的树中的拓扑序合并到一起即可。\(f_u=\dfrac{(siz_u-1)!}{\prod\limits_{v\in son_u} (siz_v!)}\prod\limits_{v\in son_u} f_v\)。
这个 DP 是 \(O(n^2)\) 的。
可以归纳证明,对于整棵树,拓扑序数量为 \(\dfrac{n!}{\prod\limits_{1\le u\le n}siz_u}\)。
这个还有组合意义的证明。考虑如何生成一个拓扑序。初始,将树上所有点设为白色,每次随机在树上选一个白点,从它向上跳到最浅的白色祖先,在当前位置记录这个祖先,然后把这个祖先染黑。
容易发现这样生成的一定是一个拓扑序。对于一个拓扑序,在这里会被算重 \(\prod siz_u\) 次,因为只要选择的点在点 \(u\) 的子树内部,那么这一位就会填 \(u\)。
显然一共有 \(n!\) 种操作序列,所以拓扑序数量为 \(\dfrac{n!}{\prod\limits_{1\le u\le n}siz_u}\)。
有标号无根树
Prüfer序列
引入强而有力的Prüfer序列。
将一棵\(n\)个节点从\(1\)到\(n\)标号的无根树用\([1,n]\)中的\(n-2\)个整数表示。可以理解为完全图的生成树与数列之间的双射关系。
其建立
每次选编号最小的叶子,记录它连向的点的编号,并删除这个叶子。重复\(n-2\)轮直到剩下两个点。
可以用堆维护这个过程,\(O(n\log n)\)建立。
也可以线性构建,首先记录当前编号最小(设为\(p\))的叶子,删除其连向的点并检查是否产生新的叶子。若新产生了叶子,设其编号为\(x\),如果\(x<p\),那么\(x\)就是当前最小,立即删除\(x\),重复以上过程指导新产生的叶子编号比\(p\)大或者没有新的叶子产生。
\(x>p\)或者没有新的叶子产生时,在编号序列上从\(p\)开始往后扫到下一个最小的编号使得其为叶子。
这样是\(O(n)\)的。
其性质
-
构造完Prüfer序列后剩下的两个点之一一定是编号为\(n\)的点。
-
每个结点在序列中的出现次数为其度数\(-1\),叶子结点没有出现。
Prüfer序列与一棵有标号无根树一一对应。
利用其重建树
就是构建的逆过程。推一下。
Cayley's Formula
完全图\(K_n\)有\(n^{n-2}\)棵生成树。
推导这个公式的方法很多,但Prüfer序列是最简单的。任意一个值域在\([1,n]\)长度为\(n-2\)的整数序列都唯一对应了一棵\(K_n\)的生成树,于是有\(n^{n-2}\)棵。
图联通方案数
Q:
\(n\)个点的有标号无向连通图,其中已确定\(k\)个连通块,第\(i\)个连通块的大小为\(s_i\),现在添加\(k-1\)条边使得图连通,求方案数。
首先将一个连通块视作一个点,将\(k\)个连通块的度数序列设出来\(\{d_i\}\)。度数之和为边数的两倍,于是有\(\sum\limits_{1\le i\le k} d_i=2k-2\)。
对于一个给定的度数序列构造Prüfer序列的方案数为\(\dbinom{k-2}{d_1-1,d_2-1,\cdots d_k-1}\),这是因为Prüfer序列长度为\(k-2\),随便划分到\([1,k]\)中去的方案数。
对于第\(i\)个连通块,接到它上面的度数在其内部还要分配,方案数为\(s_i^{d_i}\)。
于是对于一个给定的度数序列,其使图连通的方案数为\(\dbinom{k-2}{d_1-1,d_2-1,\cdots d_k-1}\cdot \prod\limits_{1\le i\le k}s_i^{d_i}\)
现在度数序列不定,我们要枚举度数序列,然后把每种度数序列的方案数加起来。
式子就是:
于是上多项式定理,就得到了\((\sum\limits_{1\le i\le k} s_i)^{k-2}\prod\limits_{1\le i\le k} s_i\),即\(n^{k-2}\prod\limits_{1\le i\le k} s_i\)。
有标号无向连通图
其实可以上GF+多项式秒了。
有标号无向连通图计数,\(n \le 10^3\)。
我们记 \(f_n\) 表示顶点数为 \(n\) 时互不相同的有标号无向连通图个数,\(g_n\) 表示顶点数为 \(n\) 时有标号无向图个数。
显然,\(g_n=2^{n \choose 2}\)。
我们考虑将所有的图按标号为 \(1\) 的点所在的连通块大小分类,可以得到:
将含有 \(f_n\) 的一项单列出来,
所以得到 \(f_n=g_n-\sum \limits_{i=1}^{n-1} {n-1 \choose i-1} f_i g_{n-i}\)。
于是 \(O(n^2)\) 计算即可。
Matrix-Tree定理
解决一张图中生成树个数的问题,还可以引申到BEST定理解决欧拉图中欧拉回路个数的问题。
注意这里不能删自环,因为自环不影响生成树个数,但是影响欧拉回路个数。
这里允许重边。
不太能证明,记一下结论。
记号
无向图中
设\(G\)是有\(n\)个顶点的无向图。
定义度数矩阵\(D(G)\),\(D_{i,i}(G)=\deg i,D_{i,j}(G)=0,i\ne j\)。
设\(\# e(i,j)\)表示\(i\)与\(j\)相连的边数。
定义邻接矩阵\(A(G)\),\(A_{i,j}(G)=A_{j,i}(G)=\# e(i,j)\)。
定义Laplace矩阵(又称之Kirchhoff矩阵)\(L(G)\),\(L(G)=D(G)-A(G)\)。
记图\(G\)的生成树个数为\(t(G)\)。
有向图中
设\(G\)是有\(n\)个顶点的有向图。
定义出度矩阵\(D^{out}(G)\),\(D_{i,i}^{out}(G)=\deg^{out} i,D_{i,j}^{out}(G)=0,i\ne j\)。
定义入度矩阵\(D^{in}(G)\),\(D_{i,i}^{in}(G)=\deg^{in} i,D_{i,j}^{in}(G)=0,i\ne j\)。
记\(\# e(i,j)\)表示从\(i\)指向\(j\)的有向边数量。
定义邻接矩阵\(A(G)\),\(A_{i,j}(G)=\# e(i,j)\)。
定义出度Laplace矩阵\(L^{out}(G)\),\(L^{out}(G)=D^{out}(G)-A(G)\)。
定义入度Laplace矩阵\(L^{in}(G)\),\(L^{in}(G)=D^{in}(G)-A(G)\)。
记图\(G\)以\(k\)为根的根向树形图个数为\(t^{root}(G,k)\)。
记图\(G\)以\(k\)为根的叶向树形图个数为\(t^{leaf}(G,k)\)。
定理内容
记\([n]=\{1,2,3,\cdots,n\}\),\(A_{S,T}\)为选取\(s\in S,t\in T\)的\(A_{s,t}\)构成的子矩阵。
无向图中
对于给定的无向图\(G\)和任意\(k\),
注意到左边是定值,于是右边随便选一个\(k\)删,得到的结果都相等。
有向图中
对于给定的有向图\(G\)和任意\(k\),
注意根向对应出度,叶向对应入度。
要统计所有根向/叶向树形图,对\(k\)求和即可。
带权形式
记\(w(T)\)表示生成树\(T\)的权值,定义它为\(T\)中每条边的边权乘积。
为什么这么定义?当视\(T\)中每条边的边权为\(1\)时,\(w(T)=1\),即\(T\)对方案数贡献了\(1\)。带边权可以视作每条边被拆成了若干条新的边,根据乘法原理求取方案数即\(w(T)\)。
当然不要硬理解成方案数,这里只是一个感性理解,直接记定理就好。
重新定义一些东西:
无向图中,定义\(\# e(i,j)\)表示\(i\)和\(j\)之间相连的边的权值之和。
记\(T(G)\)表示无向图\(G\)的生成树构成的集合。
有向图中,定义\(\# e(i,j)\)表示\(i\)连向\(j\)的边的权值之和。
记\(T^{root}(G,k)\)表示有向图\(G\)的以\(k\)为根的根向树形图构成的集合。
记\(T^{leaf}(G,k)\)表示有向图\(G\)的以\(k\)为根的叶向树形图构成的集合。
那么把上面的定理改一下就好了。
给定无向图\(G\),对于任意\(k\),
给定有向图\(G\)和\(k\),
可以继续拓展,当边权为一个GF时,应该还是成立的。
特别地,设原本边权为\(w_i\),重新设置其边权为\(w_ix+1\),那么一棵生成树的所有边权乘积的一次项系数是边权之和。
BEST定理
可以计数有向欧拉图中的欧拉回路个数。
一般无向图中的欧拉回路个数计数是NPC的。
首先要判定是欧拉图,然后特殊考虑孤立点。
以下认为\(G\)是有向欧拉图且没有孤立点。由于欧拉图中出度与入度相等,以下都记作\(\deg u\)。
考虑如何计数从\(s\)出发的欧拉回路个数?
首先拿出一棵以\(s\)为根的根向树形图,钦定除\(s\)外每个点连向父亲的边都是欧拉回路中最后一条出边,其它的出边随便排一下,\(s\)的出边随便排。以上计数即为
证明这个计数是对的,便是要证明欧拉回路与以上计数的双射关系。
-
这个方案对应到欧拉回路,就证明从这上面连续走几步总是存在欧拉路径。
-
欧拉回路对应到这个方案,就证明最后一条出边不会构成环。
于是证好了。
如果算整张图的欧拉路径\(ec(G)\),要去掉循环同构。由于点\(s\)在一条回路中会出现\(\deg s\)次,而每次出现都会是一条以\(s\)为起点的回路,于是直接除以\(\deg s\)即可。
这也说明,在欧拉图中,对于两个不同的点\(u,v\),\(t^{root}(G,u)=t^{root}(G,v)\)。
LGV引理
用于处理有向无环图上不相交路径计数问题。
定义
或者叫记号?
记\(w(P)\)为\(P\)这条路径上的边权之积,路径计数时可以将边权置为\(1\)。实际上边权可以为GF。
\(e(u,v)\)表示从\(u\)到\(v\)每一条路径\(P\)的\(w(P)\)之和。\(e(u,v)=\sum\limits_{P:u\to v}w(P)\)。
起点集合\(A\),终点集合\(B\),二者大小相等,且\(A\subseteq V,B\subseteq V\),不妨\(|A|=|B|=n\)。
一组从\(A\)到\(B\)的点不相交路径的集合记作\(S\),显然\(|S|=n\)。\(S_i\in S\)是一条从\(A_i\)到\(B_{\sigma(S)_i}\)的路径,且对于\(i\ne j\),\(S_i\)和\(S_j\)没有公共顶点。排列\(\sigma(S)\)是由\(S\)唯一确定的。
\(\tau(\sigma)\)表示排列\(\sigma\)的逆序数。
引理内容
设一个矩阵\(M\)。\(M_{i,j}=e(A_i,B_j)\),于是
这里\(S:A\to B\)是在枚举每一组\(S\)。
这里需要证明来加强理解:
首先展开\(\det M\):
冷静观察一下,对于\(\prod\limits_{i=1}^n\sum\limits_{P:A_i\to B_{\sigma(i)}}w(P)\),考虑暴力拆开相乘后每一项是什么。
可以发现这实际上是枚举了从\(A\)到\(B\)的一组路径\(P\),满足\(\sigma(P)=\sigma\)(有点混用记号,但是问题不大),将其中每条路径\(P_i\)的权值乘起来。
为了方便,设\(P\)是一组路径,这组路径的权值定义为\(w(P)=\prod\limits_{i=1}^nw(P_i)\)。
于是上面展开的式子就可以写成:
这里\(P\)是任意路径组。
已经形式很像了,只需证相交路径组的贡献为\(0\)即可。
设\(P\)中存在\(P_i:A_1\to u\to B_1\)与\(P_2:A_2\to u\to B_2\)相交,则必然存在与之对应的一组路径使得\(P'_i:A_1\to u\to B_2\)与\(P'_2:A_2\to u\to B_1\),\(P'\)其余部分与\(P\)相同。(这一部分或许不够严谨,但差不多了。)
可知\(w(P)=w(P'),\tau(\sigma(P))=-\tau(\sigma(P'))\)。于是二者贡献之和为\(0\)。故所有相交路径组的贡献之和为\(0\)。
证毕。
那么这个东西到底算了啥?
\(\det M\)是从\(A\)到\(B\)所有(点)不相交路径组的权值的带符号数量和。
当边权为\(1\)时,就是不相交路径组方案数的带符号数量和。
所带符号由\(\tau(\sigma(S))\)决定。
由于带符号,我们不能直接认为\(\det M\)是所有不相交路径组的权值之和。但是如果满足对于任意不相交路径组,\(\sigma(S)\)是偶数,那就可以。
更加一般的,可以认为\(\det M\)是所有不相交路径组中,边的交点数量为偶数的方案的权值之和减去边的交点数量为奇数的方案的权值之和。边的交点数量的奇偶性与\(\tau(\sigma(S))\)相同。

浙公网安备 33010602011771号