无根树

Prufer数列

若如初见. 提交于 2020-04-08 04:43:09
0 导语 Prufer数列是无根树的一种数列。构造简单,具有很优秀的性质。Prufer数列是生成树计数的一个巧妙工具。 1 介绍 1.1 从树到Prufer数列 一棵n个有编号节点的无根树对应 唯一 的一串长度为n-2的Prufer数列。而我们可以用迭代删点的方式生成Prufer数列。 定义无向连通图 \(G=(V,E)\) , \(|V|=|E|+1\) 。我们定义叶子节点为度数为1的节点。然后按以下步骤: 找到一个节点 \(u\in V\) ,满足 \(deg_u=1\) 的最小的 \(u\) ,记下 \(u\) 和边 \((u,v)\in E\) 。 在Prufer数列中加入节点 \(v\in V\) ,在原图中删去 \(u\) 和边 \((u,v)\) 。 如果 \(|V|=2\) 则停止,否则重复1,2。 比如上图 找到5,在数列中加入2,删除5及其连边 找到6,在数列中加入2,删除6及其连边 找到7,在数列中加入3,删除7及其连边 找到2,在数列中加入1,删除2及其连边 找到3,在数列中加入1,删除3及其连边 结束,得到数列[2,2,3,1,1]。 1.2 从Prufer数列到树 ​ 一串长度为n-2的Prufer数列对应 唯一 的一棵n个有编号节点的无根树。 取出Prufer数列最前面的元素 \(u\) ,删除 \(u\) 。 在点集 \(V\)

Prufer编码

孤者浪人 提交于 2020-04-08 04:42:59
Prufer编码 1.概念 给定一棵带标号的无根树,找出编号最小的叶子结点,写下与它相邻的节点的编号,然后删掉这个叶子结点。反复执行这个操作直到只剩两个节点为止。由于节点数 \(n>2\) 的树总存在叶子节点,因此一棵 \(n\) 个节点的无根树唯一对应了一个长度为 \(n - 2\) 的数列,数列中的每个数都在 \(1\) 至 \(n\) 的范围内。 将Prufer序列中第一个数与没有出现在Prufer序列中的第一个数连边;之后按次序依次将第 \(2,3,…,n - 2\) 个数与其对应的未出现在Prufer序列中的第 \(2,3,…,n - 2\) 个数连边;最后剩下两个点直接连边。这样就重新构建出来了原来的无根树。 这样每一棵 \(n\) 个节点的无根树唯一的对应了一个 \(n - 2\) 长度的数列,数列中的每个数都在 \(1\) 至 \(n\) 的范围内。 2.性质 易得 \(n\) 个点的无向完全图的生成树计数( \(n\) 个点的有标号无根树的计数)为 \(n^{n-2}\) 。 Prufer序列中某个编号出现的次数等于此编号节点在树中的度数减一。 有 \(n\) 个节点,每个节点的度数分别为 \(D_{1}, D_{2}, …,D_{n}\) ,此时无根树的个数为 \(\dfrac{(n - 2) !}{[(D_{1} - 1)! (D_{2} - 1)!…(D_

LG5900 无标号无根树计数

≯℡__Kan透↙ 提交于 2020-01-10 21:58:57
有依赖的辅助多项式分治卷积 \[ g_n=\bigoplus_{i=1}^nf_i\\ f_n=\sum_{i=1}^{n-1}f_ig_{n-i} \] 已知 \(f_0=g_0=0,f_1=1\) ,求 \(f_2\sim f_n\) 。对 \(998244353\) 取模。 \(n \leq 10^5\) 。 题解 这类问题的特点: 只有 \(f_1\sim f_n\) 都求出后, \(g_n\) 才能被算出。 卷积的时候不需要 \(g_n\) 。 普通的分治卷积策略是: \[ (f_l\sim f_{mid})\times (g_1\sim g_{r-l}) \rightarrow (f_{mid+1}\sim f_r) \] 在这个问题中,当 \(l=1\) 的时候, \(g_{r-l}\) 未被算出。所以不能这样卷积。 特殊的分治卷积策略是: \(l=1\) 时, \[ (f_l\sim f_{mid})\times (g_l\sim g_{mid})\rightarrow (f_{mid+1}\sim f_r)\\ \] 这样计算的话只有 \(f_{mid+1}\) 的结果是准确的。其余的不仅没有考虑 \(f_{mid+1}\sim f_{i-1}\) 对 \(f_{i}\) 的贡献,还没有考虑 \(g_{mid+1}\sim g_{i-1}\) 对它的贡献。 \(l

Prufer序列

只谈情不闲聊 提交于 2020-01-07 23:25:49
Prufer序列 Prufer 序列可以将一个带标号 \(n\) 个结点的无根树用 \(n-2\) 个 \([1,n]\) 的整数表示。也可以理解为完全图的生成树与数列之间的双射。 带标号无根树与 \(Prufer\) 序列是一一对应的。 无根树转Prufer序列 有一棵带标号无根树。它的 \(Prufer\) 序列构造如下:  每次选择一个编号最小的叶结点并删掉它,然后在序列中记下和它相邻的那个结点的编号。反复执行操作直到只剩下两个结点。 Prufer序列转无根树 有一个 \(Prufer\) 序列和 \(n\) 个点的点集。转回无根树就是:  每次取出 \(Prufer\) 序列中最前面的元素 \(x\) ,和点集中编号最小的不在 \(Prufer\) 序列的元素 \(y\) ,给 \(x,y\) 连边之后分别删去。最后点集中剩下两个结点,把它们连边。 性质 \(Prufer\) 序列中每个编号出现次数等于该结点在原树中的度数-1。(只有作为叶子被删去时不会加入序列中) Cayley′s Formula 因为 \(Prufer\) 序列和原树是一一对应的关系,所以 \(n\) 个点带标号无根树的方案数为 \(n^{n-2}\) 。 \(Ex\) : 1.如果给定每个点度数$d_1,d_2,\dots,d_n $,那么 对应的无根树的数量为 \(\frac{(n-2)!}{

数学笔记本

[亡魂溺海] 提交于 2019-12-06 06:38:50
由于蒟蒻数学不好,特将所有关于数学(主要是组合数学)的小笔记扔在这里 著名的快速幂 int a,b,m; scanf("%lld%lld%lld",&a,&b,&m); int ans=1,base=a; while(b!=0) { if(b & 1 != 0) { ans*=base; ans=ans%m; } base*=base; base%=m; b>>=1; } 乘法逆元 a在mod p意义下的乘法逆元是a^(p-2) 无根树 一个无根树有n^(n-2)个形态 Cayley 公式 来源: https://www.cnblogs.com/lzy-blog/p/11965883.html