prufer序列笔记】的更多相关文章

prufer序列 度娘的定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 对于一棵确定的无根树,对应着唯一确定的prufer序列 构造方法 无根树转化为prufer序列 找到编号最小的度数为\(1\)的点 删除该节点并在序列中添加与该节点相连的节点的编号 重复\(1,2\)操作,直到整棵树只剩下两个节点 如下图的prufer序列为\(3,5,1,3\) prufer序列转化为无根树…
首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.net/morejarphone/article/details/50677172 因为是偶然翻了他的这篇博文,然后就秒会了. prufer数列,可以用来解一些关于无根树计数的问题. prufer数列是一种无根树的编码表示,对于一棵n个节点带编号的无根树,对应唯一一串长度为n-1的prufer编码. (…
prufer序列是一个定义在无根树上的东西. 构造方法是:每次选一个编号最小的叶子结点,把他的父亲的编号加入到序列的最后.然后删掉这个叶节点.直到最后只剩下两个节点,此时得到的序列就是prufer序列. 这个构造可以用优先队列做到 $O(n\log n)$. 至于如何用prufer序列反推出树,我还有点没看懂怎么 $O(n\log n)$,以后看懂了再来填坑吧. prufer序列的一些性质: 一棵 $n$ 个点的无根树prufer序列长度为 $n-2$. 无根树和prufer序列一一对应,一个无…
前言 PKUWC和NOIWC都考察了prufer序列,结果统统爆零 prufer序列就是有标号生成树对序列的映射 prufer序列生成 每次选择编号最小的叶子删掉,把叶子的父亲加入prufer序列,直到剩下2个点 set维护叶子,nlogn prufer序列还原 用set维护没有在剩余prufer序列中的点,不断取出prufer序列首项A,和set中最小的编号连边.然后删除两个点.(如果A在剩下的prufer序列不存在了,就加入set) 摘自百度百科: 性质 来自:https://www.cnb…
prufer 序列是一种无根树的序列,对于一个 \(n\) 个点的树,其 prufer 序列的长度为 \(n-2\). prufer 序列和原树之间都可以唯一地相互转化. 构造 构造 prufer 序列分为如下的步骤: 找到一个编号最小的度数为 \(1\) 的点: 将与这个点相邻的点的编号加入 prufer 序列的后面: 删除这个点: 重复上述步骤,知道原树只剩下 \(2\) 个点,这两个点之间应该有一条边. 还原 令集合 \(V = \{1, 2, \cdots, n\}\). 取出 pruf…
什么是 prufer 序列 是可以和 \(n\) 个有标号节点的无根树一一对应的长度为 \(n-2\) 的序列. 一般来说是用于和树相关的组合计数问题,但是可能会出现一些变形,所以除了要了解一些性质,大致的构造思路也要知道. 如何构建 prufer 序列 每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点. 重复 \(n-2\) 次后就只剩下两个结点,算法结束. 如何还原 prufer 序列 每次选择一个度数为 \(1\) 的最小的结点编号,与当前枚举到的 Prufer…
[容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交的补集]和[集合并 或 集合并的补集]之间相互转化的问题. 定义目标函数为f(m),已知函数g(T).(例如已知集合并,则T表示所有T个集合的集合并,通常g(T)=C(n,T)*T个集合的集合并) 当两者都不是补集或两者都是补集时,有f(S)=Σ(-1)|T|-1g(T),其中T为S的非空子集,即奇…
原文出处:https://www.cnblogs.com/dirge/p/5503289.html 树的计数 + prufer序列与Cayley公式 学习笔记(转载) 首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.net/morejarphone/article/details/50677172 因为是偶然翻了他的这篇博文,然后就秒会了. pruf…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1430 题解 prufer 序列模板题. 一个由 \(n\) 个点构成的有标号无根树的个数为 \(n^{n-2}\). 证明就是 prufer 序列,可以看我的学习笔记. https://www.cnblogs.com/hankeke/p/prufer.html 然后因为一棵树的加边顺序随意,所以还需要乘上 \((n-1)!\). 所以最后答案为 \(n^{n-2}(n-1)!\). #inc…
两道题目大意都是根据每个点的度数来构建一棵无根树来确定有多少种构建方法 这里构建无根树要用到的是prufer序列的知识 先很无耻地抄袭了一段百度百科中的prufer序列的知识: 将树转化成Prufer数列的方法 一种生成Prufer序列的方法是迭代删点,直到原图仅剩两个点.对于一棵顶点已经经过编号的树T,顶点的编号为{1,2,...,n},在第i步时,移去所有叶子节点(度为1的顶点)中标号最小的顶点和相连的边,并把与它相邻的点的编号加入Prufer序列中,重复以上步骤直到原图仅剩2个顶点. 例子…
题目大意: 告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树 这里注意数量为0的情况,就是 当 n=1时,节点度数>0 n>1时,所有节点度数相加-n!=n-2 可以通过通过除了根,必然有n-1个节点作为上一个节点的儿子来理解 然后通过学习prufer序列可知 每一颗树都能够建成唯一的序列,这里的n-2个数就是任意插入到prufer序列中,这很明显就是一个排列,那么之后就是计算 ans = (n-2)!/(w[1]!*w[2]!..w[n]!) w[i]表示i节点上的度数减…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那题 说下prufer序列的性质: 1.一个无根树对应一个prufer序列 2.一个n个节点无根树对应的prufer序列长度为n-2 3.prufer序列中某节点出现的次数==这个节点在对应的无根树中度数-1 所以这题求无根树的数量等价于求prufer序列的数量. 注意无解的情况就行了.…
题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后再乘起来 注意此题无解须要输出0 当n!=1&&d[i]==0时 输出0 当Σ(d[i]-1)!=n-2时输出0 写代码各种脑残--竟然直接算了n-2没用阶乘-- #include<cstdio> #include<cstring> #include<iostre…
题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架 的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森林的小猴都会成为好朋友. 现 在的问题是,总共有多少种不同的打架过程. 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1 -2}{2-3,1-3}六种不同的打架过程. 输入 一个整数N,N<=10^6 输出 一行,方案数mod 9999991. 样例输入…
题目描述 有\(n\)点,每个点有度数限制,\(\forall i(1\leq i\leq n)\),让你选出\(i\)个点,再构造一棵生成树,要求每个点的度数不超过度数限制.问你有多少种方案. \(n\leq 100\) 题解 考虑prufer序列. 每个prufer序列唯一对应一棵无根树. 设\(f_{i,j,k}\)为前\(i\)个点选了\(j\)个点,目前的prufer序列长度为\(k\)的方案数. 每次枚举下一个点选不选和度数 不选:\(f_{i+1,j,k}+=f_{i,j,k}\)…
介绍 其实是\(pr\ddot{u}fer\)序列 什么是prufer序列? 我们认为度数为\(1\)的点是叶子节点 有一颗无根树,每次选出编号最小的叶子节点,加到当前prufer序列的后面,然后删掉这个节点.直到剩下两个点为止. 这样会得到一个长度为\(n-2\),每个数都是\(1\text{~}n\)的序列. 可以看出,每棵无根树都对应唯一一个序列. 我们发现,所有叶子节点都不在prufer序列中,一个度数为\(d\)的点在prufer序列中的出现次数是\(d-1\). 那么怎样从一个pru…
题目描述 给你\(n\)和\(n\)个点的度数,问你有多少个满足度数要求的生成树. 无解输出\(0\).保证答案不超过\({10}^{17}\). \(n\leq 150\) 题解 考虑prufer序列. 答案为 \[ \frac{(n-2)!}{\prod(d_i-1)!} \] 直接乘会爆long long,要转成\(n-1\)个组合数的乘积.当然你也可以分解质因数. 如果\(n\neq 1\)且\(d_i=1\),输出\(0\) 如果\(\sum d_i\neq 2n-2\),输出\(0\…
题目大意 求\(n\)个点\(n\)条边的无向连通图的个数 \(n\leq 5000\) 题解 显然是一个环上有很多外向树. 首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为: \[ \binom{n}{k}\times n^{n-k-1}\times k \] 前面\(\binom{n}{k}\)是这些根的选编号的方案数,后面是prufer序列得到的:前面\(n-k-1\)个数可以是\(1\)~\(n\),第\(n-k\)个数是\(1\)~\(k\). 我的理解是:每个…
传送门 思路 有标号无根树的计数,还和度数有关,显然可以想到prufer序列. 问题就等价于求长度为\(n-2\),值域为\([1,n]\),出现次数最多的恰好出现\(m-1\)次,这样的序列有哪些. 恰好\(m-1\)次不好求,变成最多\(m-1\)减去最多\(m-2\)的方案数. 考虑指数型生成函数.设要求的最多为\(M\),则设\(A(x)=\sum_{i=0}^M \frac{1}{i!}x^i\),答案就为\((n-2)![x^{n-2}]A^n(x)\),多项式快速幂即可. 代码 #…
参考博客https://www.cnblogs.com/dirge/p/5503289.html (1)prufer数列是一种无根树的编码表示,类似于hash. 一棵n个节点带编号的无根树,对应唯一串长度为n-2的prufer编码.所以一个n阶完全图的生成树个数就是. 首先定义无根树中度数为1的节点是叶子节点. 找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点. (2)prufer序列转化为无根树. 我们设点集为{1,2...n}.然后我们每次找到点集中没有出现…
\(prufer\)序列和完全图的生成树一一对应(考虑构造) 完全图的生成树个数为\(n^{n - 2}\) 满足第\(i\)个点的度数为\(d_i\)的生成树为\(\frac{n!}{\prod (d_i - 1) !}\) 把\(m\)个联通块,第\(i\)个大小为\(a_i\),连接起来的方案数为\(n^{m - 2} \prod a_i\) \(n\)个点,指定\(k\)个点在不同的树中,形成\(k\)个森林的方案数为\(k * n^{n - k - 1}\)…
题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法的方案数. 然后就和 BZOJ4766文艺计算姬 一致了,假设两边点集大小分别为 \(n,m\) ,生成树个数就是 \(n^{m-1}m^{n-1}\) 证明可以考虑 prufer 序列还原树时的操作,将所有点先放入 set 中,每次将没有出现在序列中的编号最小的点拿出来和 prufer 序列开头的…
[BZOJ1005][HNOI2008]明明的烦恼(prufer序列) 题面 BZOJ 洛谷 题解 戳这里 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define ll lo…
1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数. Input 第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即…
[CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出和给出的树至少有k个点相同的树的数量.我们先选出原树中的k条边,然后剩下的边随便连.选出k条边后,原树被分成n-k个连通块,设其大小分别为$siz_1,siz_2...siz_{n-k}$.那么剩下的边随便连的方案数是多少呢?我们不妨把每个连通块看成一个点,答案变成n个点的完全图的生成树个数,根据P…
题面 传送门 题解 结,结论题? 答案就是\(n^{m-1}m^{n-1}\) 我们考虑它的\(Prufer\)序列,最后剩下的两个点肯定是一个在左边一个在右边,设左边\(n\)个点,右边\(m\)个点,\(Prufer\)序列中左边的点肯定出现了\(m-1\)次,右边的点出现了\(n-1\)次,那么就是上面那个了 听说这题可以手屠基尔霍夫矩阵做出来 //minamoto #include<bits/stdc++.h> #define R register #define ll long lo…
\(prufer\)序列: 无根树转\(prufer\)序列: 不断找编号最小的叶子节点,删掉并在序列中加入他相连的节点. \(prufer\)转无根树: 找到在目前\(prufer\)序列中未出现且未使用的编号最小的的节点与当前位相连,当前位从\(prufer\)序列中删除,节点标为已使用,剩余最后两个未使用的节点相连. 性质: \(1.prufer\)序列中某个编号出现的次数就等于这个编号的节点在无根树中的度数-1. \(2.\)一棵n个节点的无根树唯一地对应了一个长度为\(n-2\)的数列…
codeforces 156D Clues 题意 给定一个无向图,不保证联通.求添加最少的边使它联通的方案数. 题解 根据prufer序列,带标号无根树的方案数是\(n^{n-2}\) 依这个思想构建树即可. 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define rep(i, a, b…
题目描述 给出 $n$ 个点,每次选择任意一条边,问这样 $n-1$ 次后得到一棵树的方案数是多少. 输入 一个整数N. 输出 一行,方案数mod 9999991. 样例输入 4 样例输出 96 题解 Prufer序列 答案完全可以看作两部分:生成一棵树的方案数*最终的树的个数. 生成一棵树的方案数即边的全排列树 $(n-1)!$ . 最终的树的个数即Prufer序列的结论 $n^{n-2}$ ,因为 $n-2$ 个位置每个位置均有 $n$ 个选择. 本题 $n$ 较小,直接暴力计算即可. #i…
题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1 输出 一个整数,表示不同的满足要求的树的个数,无解输出0 样例输入 3 1 -1 -1 样例输出 2 题解 Prufer序列+高精度 Prufer序列:由一棵 $n$ 个点的树唯一产生的一个 $n-2$ 个数的序列. 生成方法:找到这棵树编号最小的叶子节点,将其…