Prufer序列
Prufer序列是一种将树和序列双向映射的方式
构造方法:
- 统计树上结点的度数
- 找到所有叶子结点
中编号最小的 ,输出 - 将
的度数减 - 重复步骤
,直到只剩下 个元素为止
性质:
- 树上结点编号在prufer序中出现的次数为
次 - 最后剩下的
个点中,一定包含编号为 的结点
下面为获得prufer序的代码:
void to_prufer() { for(int i=1;i<=n;i++)du[i]++,du[fa[i]]++; int cur; for(int i=1;i<=n;i++)if(du[i]==1) { cur=i; break; } int leaf=cur; for(int i=1;i<=n-2;i++) { int f=fa[leaf]; prufer[i]=f; du[f]--; if(du[f]==1 && f<cur) { leaf=f; continue; } cur++;while(du[cur]!=1) cur++; leaf=cur; } } //要以n为根
下面为获得树的代码:
void to_tree() { for(int i=1;i<=n;i++) du[i]=1; for(int i=1;i<=n-2;i++) du[prufer[i]]++; int cur; for(int i=1;i<=n;i++)if(du[i]==1) { cur=i; break; } int leaf=cur; for(int i=1;i<=n-2;i++) { int f=fa[leaf]=prufer[i]; du[f]--; if(du[f]==1 && f<cur) { leaf=f; continue; } ++cur;while(du[cur]!=1) cur++; leaf=cur; } fa[leaf]=n; }
应用:
个点的无向完全图的不同生成树的个数 个点的无根树的方案数 个点的有根树的方案数 个点,第 个点的度数为 的无根树的方案数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】