首页 > 其他分享 >Rebuild Tree

Rebuild Tree

时间:2024-10-06 08:49:00浏览次数:5  
标签:return 50005 int Rebuild Tree long n1 mod

  • 考虑\(\prod s[i]\)的组合意义:就是在每个连通块内选一个点的方案数
  • 应用链式前向星存图时,应当舍弃“0-1”变换,从2号边开始编号【对于其他情况,也应尽量避免从0开始编号】
  • 枚举子树大小DP是O(n^2)的,但如果有m的限制,可以证明时间复杂度降至O(nm)
  • 因为出点和入点未必相同,所以不能简单地把连通块大小相乘;但相信最后的结果是美的,可以大胆猜想把m+1换成n
  • 加法式枚举的好处在于,保证了两边都是合法的,避免了复杂度的错误
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[50005];
int s[50005],n,m;
const int mod=998244353;
long long f[50005][105][2],g[105][2];
int power(int n,int p)
{
	if(p==0)
	{
		return 1;
	}
	long long tmp=power(n,p/2);
	if(p%2==1)
	{
		return tmp*tmp%mod*n%mod;
	}
	return tmp*tmp%mod;
}
void dp(int n1)
{
	s[n1]=1;
	f[n1][0][0]=1;
	f[n1][0][1]=1;
	for(int i=0;i<a[n1].size();i++)
	{
		if(!s[a[n1][i]])
		{
			dp(a[n1][i]);
			int k=a[n1][i];
			memcpy(g,f[n1],sizeof(f[n1]));
			memset(f[n1],0,sizeof(f[n1]));
			for(int j=0;j<=min(s[n1]-1,m);j++)
			{
				for(int l=0;l<=min(s[k]-1,m);l++)
				{
					if(j+l>m)
					{
						break;
					}
					(f[n1][j+l][0]+=(g[j][0]*f[k][l][0]%mod))%=mod;
					(f[n1][j+l][1]+=(g[j][1]*f[k][l][0]%mod+g[j][0]*f[k][l][1]%mod))%=mod;
					if(j+l+1<=m)
					{
						(f[n1][j+l+1][0]+=(g[j][0]*f[k][l][1]%mod))%=mod;
						(f[n1][j+l+1][1]+=(g[j][1]*f[k][l][1]%mod))%=mod;
					}
				}
			}
			s[n1]+=s[a[n1][i]];
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		a[u].push_back(v);
		a[v].push_back(u);
	}
	dp(1);
	cout<<f[1][m][1]*power(n,m-1)%mod<<endl;
	return 0;
}

标签:return,50005,int,Rebuild,Tree,long,n1,mod
From: https://www.cnblogs.com/watersail/p/18446565

相关文章

  • Solution - Atcoder ARC157E XXYX Binary Tree
    考虑这个不存在\(\texttt{YY}\)的限制,与\(\texttt{XX}\)个数为变量的限制相比较,看起来\(\texttt{Y}\)就更特殊,于是考虑从\(\texttt{Y}\)的视角来分析问题。同时考虑到因为有\(A+B+C=n-1\),所以\(\texttt{XX}\)其实也不是很重要,因为只需要让\(\texttt{XY}\)和......
  • CF280C Game on Tree题解
    题目描述给定一棵有根树,结点编号从1到n。根结点为1号结点。对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后游戏结束。也就是说,删除1号结点后游戏即结束。要求求出删除所有结点的期望操作次数。不是哥们,我好不容易国庆......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......
  • ant-table tree结构连线
    做一个类似这样的效果template<a-tableclass="custom-tree-table"rowKey="id":dataSource="tableData1":pagination="false":defaultExpandAllRows="true":expandable=&qu......
  • 红黑树(Red-Black Tree):原理、常见算法及其应用
    目录引言红黑树的基本概念常见算法插入节点查找节点删除节点红黑树的应用场景1.数据库索引2.符号表3.动态集合总结优势对比自平衡条件旋转次数操作效率应用场景实现复杂度引言红黑树(Red-BlackTree)是一种自平衡的二叉查找树,它的设计目的是为了在最坏的......
  • AVLTree【c++实现】
    目录AVL树1.AVL树的概念2.AVLTree节点的定义3.AVLTree的插入4.AVLTree的旋转4.1左单旋4.2右单旋4.3左右双旋4.4右左双旋5.AVLTree的验证6.AVLTree的性能AVL树AVLTree的代码实现连接:AVLTree代码链接1.AVL树的概念学习了二叉搜索树之后,我们知道二叉搜索树虽可以......
  • 生信机器学习入门4 - 构建决策树(Decision Tree)和随机森林(Random Forest)分类器
    机器学习文章回顾生信机器学习入门1-数据预处理与线性回归(Linearregression)预测生信机器学习入门2-机器学习基本概念生信机器学习入门3-Scikit-Learn训练机器学习分类感知器生信机器学习入门4-scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型1.决策树(Dec......
  • 1043 Is It a Binary Search Tree——PAT甲级
    ABinarySearchTree(BST)isrecursivelydefinedasabinarytreewhichhasthefollowingproperties:Theleftsubtreeofanodecontainsonlynodeswithkeyslessthanthenode'skey.Therightsubtreeofanodecontainsonlynodeswithkeysgreater......
  • 移动端tree组件父子组件联动。
     <!--*@Author:yeminglong*@Date:2024-09-2710:14:30*@LastEditors:yeminglong*@LastEditTime:2024-09-2716:49:05*@Description:--><script>importTreeItemfrom'@/views/test/TreeItem.vue'exportdefault{ name:&#......
  • 数据结构:实现链式结构二叉树(Tree) 手把手带你入门数据结构~
    文章目录前言一、链式结构二叉树的概念1.定义2.节点结构3.操作4.优势与劣势二、链式结构二叉树的实现1.树结构的定义2.树的遍历(1)前序遍历(2)中序遍历(3)后序遍历3.二叉树结点个数4.二叉树叶子结点个数5.二叉树第k层结点个数6.二叉树的深度/高度7.二叉树查找值为......