首页 > 其他分享 >Prufer序列

Prufer序列

时间:2024-01-30 21:13:20浏览次数:21  
标签:结点 个点 degree int prufer 根树 序列 Prufer

Prufer序列是一种将树和序列双向映射的方式

构造方法:

  1. 统计树上结点的度数 \(degree_i\)
  2. 找到所有叶子结点 \((degree_i==1)\) 中编号最小的 \(x\),输出 \(fa_x\)
  3. 将 \(fa_x\) 的度数减 \(1\)
  4. 重复步骤 \(2-3\),直到只剩下 \(n-2\) 个元素为止

性质:

  1. 树上结点编号在prufer序中出现的次数为 \(degree_x-1\) 次
  2. 最后剩下的 \(2\) 个点中,一定包含编号为 \(n\) 的结点

下面为获得prufer序的代码:

void to_prufer()
{
	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[dur]!=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;
}

应用:

  1. \(n\) 个点的无向完全图的不同生成树的个数 \(n^{n-2}\)
  2. \(n\) 个点的无根树的方案数 \(n^{n-2}\)
  3. \(n\) 个点的有根树的方案数 \(n^{n-1}\)
  4. \(n\) 个点,第 \(i\) 个点的度数为 \(degree_i\) 的无根树的方案数 \(\frac{(n-2)!}{\prod_{i=1}^{n}{(degree_i-1)!}}\)

标签:结点,个点,degree,int,prufer,根树,序列,Prufer
From: https://www.cnblogs.com/noipwen/p/17997740

相关文章

  • net8 对接webapi接口通过 GetFromJsonAsAsyncEnumerable方法直接得到对象,无需进行反序
    调用API直接获取到对象现在有一个接口返回如下图中的数据:如果是在8以前的版本中获取该接口的数据,需要先获取到接口内容,然后进行反序列化,代码如下conststringRequestUri="http://localhost:5145/user";usingvarclient=newHttpClient();varstream=awaitclient......
  • 每日一道面试题:Java中序列化与反序列化
    写在开头哈喽大家好,在高铁上码字的感觉是真不爽啊,小桌板又拥挤,旁边的小朋友也比较的吵闹,影响思绪,但这丝毫不影响咱学习的劲头!哈哈哈,在这喧哗的车厢中,思考着这样的一个问题,Java中的对象是如何在各个方法,或者网络中流转的呢?通过这个问题便引出了我们今天的主人公:序列化与反序列化!......
  • C#对象二进制序列化优化:位域技术实现极限压缩
    目录1.引言2.优化过程2.1.进程对象定义与初步分析2.2.排除Json序列化2.3.使用BinaryWriter进行二进制序列化2.4.数据类型调整2.5.再次数据类型调整与位域优化3.优化效果与总结1.引言在操作系统中,进程信息对于系统监控和性能分析至关重要。假设我们需要开发一个监控程序,该......
  • PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附
    全文下载链接:http://tecdat.cn/?p=22617最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器  %matplot......
  • MySQL 序列使用AUTO_INCREMENT
    MySQL序列是一组整数:1,2,3,…,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法就是使用MySQLAUTO_INCREMENT来定义列。实例......
  • MFC 文件 File 序列化和反序列化
    //写文件voidCMainFrame::OnCarchiveWrite(){ //TODO:在此添加命令处理程序代码 /* a)创建文件对象CFile b)以写方式打开文件CFile::Open c)创建序列化对象,并且和文件关联在一起CArchive CArchive::store把数据保存到归档文件中。允许CFile写操作。 d)......
  • 大语言模型关于时间序列预测的文章和关于LLM做金融预测的文章
    任务:寻找大语言模型关于时间序列预测的文章 和关于LLM做金融预测的文章 下面是我的总结:所有的文章都是为了解决一个问题:TS数据和文本数据之间的对齐问题。 将时间序列(TimeSeries,TS)与LLM融合的方式有两条路线:(1)LLM-for-TS:针对TS数据,从头开始设计并预训练一个基本的......
  • Leetcocde 1092. 最短公共超序列
    https://leetcode.cn/problems/shortest-common-supersequence/description/给你两个字符串str1和str2,返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。如果从字符串t中删除一些字符(也可能不删除),可以得到字符串s......
  • php session反序列化
    关于SessionSession,在汉语中表示通话、会话、对话(期)、话路[对谈时间]的意思,其本来的含义一个终端用户与交互系统进行通信的时间(间隔),通常是指从注册(进入系统)到注销(退出系统)之间所经过的时间。比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个Session......
  • CRC冗余检测计算与FCS帧检验序列
    差错检测1.奇偶校验漏检率大,不建议使用2.CRC冗余检测CRC循环冗余校验是一种常用的检错方法,而FCS是添加在数据后面的用来校验的冗余码。优点:漏检率低,运算速度快等这里别的博主已经讲得十分详细CRC与FCS计算原理CRC的种类与算法实现3.纠错码计算较为复杂,参考纠错码的......