学习笔记:树与图上的计数问题
Prüfer 序列#
从树到 Prüfer 序列#
为空序列。- 如果当前树上多于两个节点,假设当前标号最小的叶子为
,与 相连的节点标号为 ,那么把 从树上删除,把 加入 末尾。 - 重复 2. 直到树上只有两个节点。
性质
- 在构造完 Prufer 序列后原树中会剩下两个节点,其中一个一定是编号最大的点
。 - 每个节点在序列中出现的次数是其度数减
,因此没有出现的就是叶节点。
实现
可以
由于最后一定会留下
定义:
为 的父节点。 为 的儿子数量。 为 prufer 序列的第 项。
流程:
定义
。- 将
减 ,表示删去 这个节点。 - 如果
且 ,那么 比当前最小值还要小,直接令 。
void Tree_to_Prufer() {
for(int i = 1; i < n; ++ i) {
cin >> f[i];
++ d[f[i]];
}
for(int cur = 0, i = 1; cur < n - 2; ++ i) {
while(d[i]) ++ i;
p[++ cur] = f[i];
while(cur < n - 2 && -- d[p[cur]] == 0 && p[cur] < i) {
p[cur + 1] = f[p[cur]];
++ cur;
}
}
for(int i = 1; i <= n - 2; ++ i) cout << p[i] << ' ';
}
从 Prüfer 序列到树#
- 找到当前不在
中且还未使用的最小元素 。(等价于是叶子节点) 与 的第一个元素连边。- 删除
的第一个元素,如果 非空,重复上述过程。(把叶子删掉,当前节点度数减一) - 最后还剩两个点未使用,将他们连边。
代码实现类似。
void Prufer_to_Tree() {
for(int i = 1; i <= n - 2; ++ i) {
cin >> p[i];
++ d[p[i]]; // 以 $n$ 为根,儿子数量
}
p[n - 1] = n;
for(int cur = 1, i = 1; cur <= n - 1; ++ cur, ++ i) {
while(d[i]) ++ i;
f[i] = p[cur];
while(cur < n - 1 && -- d[p[cur]] == 0 && p[cur] < i) {
f[p[cur]] = p[cur + 1];
++ cur;
}
}
for(int i = 1; i <= n - 1; ++ i) cout << f[i] << ' ';
}
Caylay 定理#
例题#
P6086 【模板】Prufer 序列#
P2290 [HNOI2004] 树的计数#
题意:给定每个点的度数
相当于
即
由于保证了答案小于
特判无解,根据 prufer 序列的性质,一定有
CF1267F Foolpruf Security#
题意:二分图
满足图
给定其 prufer 序列的两个子序列
prufer 序列最后剩下的两个点,一定一个在左边,一个在右边。
于是左边删了
同理,大于
因此如果
代码与模板类似,稍加改动使得左右端点分局两侧。
void Prufer_to_Tree() {
b[n] = n + m;
for(int ia = 1, ib = 1, j = 1; ia <= m - 1 || ib <= n; ++ j) {
while(d[j]) ++ j;
int cur;
if(j <= n) {
cout << j << ' ' << b[ib] << '\n';
cur = b[ib];
}
else {
cout << j << ' ' << a[ia] << '\n';
cur = a[ia];
}
while(1) {
if(cur <= n) {
if(ia <= m - 1 && -- d[a[ia]] == 0 && a[ia] < j) {
cout << a[ia] << ' ' << b[ib] << '\n';
++ ia;
cur = b[ib];
}
else break;
}
else {
if(ib <= n && -- d[b[ib]] == 0 && b[ib] < j) {
cout << b[ib] << ' ' << a[ia] << '\n';
++ ib;
cur = a[ia];
}
else break;
}
}
cur <= n ? ++ ia : ++ ib;
}
}
BZOJ4766 文艺计算姬#
题意:完全二分图
根据上题结论,将其 prufer 序列分为大于
所以总方案为
E-Valuable Forests#
题意:定义树
定义
枚举元素
定义
枚举每个点
定义
枚举
Matrix Tree Theorem#
设无向图
删去第
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话