题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树的数量. 答案对大质数取模.\(1\leq n\leq 1000,2\leq d \leq 10,10^{8}\leq \text{mod} \leq 10^9\). Solution Part 1 先来思考一个组合问题:在 \(x\) 个方案中不分顺序地选 \(t\) 种,可重复.求方案数. 这里…
CF724F Uniformly Branched Trees 有根树可以统计.无根树难以统计.因为可以换根. 所以不让换根:只要两个无根树在重心位置不同构,就一定不同构 每个本质不同的树在重心位置统计上. f[i][j][k]i个点根节点度数j,最大子树不超过k.枚举k大小的子树个数转移. 重心两个? 特殊考虑.两端f[n/2][d-1][n/2-1]=x,x*(x-1)/2+x 边界考虑到. #include<bits/stdc++.h> #define reg register int…
[CF724F]Uniformly Branched Trees 题意:询问n个点的每个非叶子点度数恰好等于d的不同构的无根树的数目. $n\le 1000,d\le 10$. 题解:先考虑有根树的版本.我们用$DP(n,m,k)$表示n个点,其中根的度数为m,其余点度数为d,根的最大的儿子的子树不能超过k的方案数.转移时我们可以枚举有多少个子树大小为k的.假如有i个,则贡献为:$DP(n-ik,m-i,k-1)\times{{DP(k,d-1,k-1)+i-1} \choose{i}}$,采用…
F - Uniformly Branched Trees #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define PLI pair<LL, int> #define ull unsigned long long using namespace std; ;…
题意与分析 题意是这样的,定义一个从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 现在求一棵最短生成树,输出总边权和与选取边的编号. 我们首先要明白这样一个结论:对一个图求Dijkstra后,把所有得到的最短路边全部连起来,生成的图一定是一棵树,是不会有环的.原因自己推一下就可以感受到. 那么这样一来,这个树相当于我们在Dijkstra的时候就已经得到了.记录边是Dijkstra的基本操作,而我们只需要考虑一下当最短路相等时谁更优的情况并更新就可以了. 代码 #inc…
BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形). 题解 我的做法是直接枚举三个是否旋转90度,然后考虑两种组成,|||和=|,枚举3的排列. 其实可以先计算面积s,如果r=sqrt(s)不是整数则无解.然后找到一个较长边为r的矩阵先输出,再输出剩下两个. 代码 #include <cstdio> #include <algorithm…
BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严格包含的路径.实际上答案就是不严格包含的+4步. 也可以加上每个点上下左右的四个点再跑凸包. 最少步数就是凸包上相邻两点的\(max(\Delta x,\Delta y)\)之和. 其实这题也可以不求凸包,用平行于对角线的四条边非严格包含地去围这些点,若相交的地方不在格点上,我们四边都往外扩展后,也…
BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插入l位置前,执行k(1 ≤ k ≤ 1 000 000)次.输出最后的s. 题解 等价与将字符串的[l...r-k]和[r-k+1...r]两部分调换一下. k对r-l取模一下.然后模拟. 还有种方法是将两部分分别翻转,再整个字符串翻转一下. 也可以用stl的rotate函数. 代码 #includ…
BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时每个节点的孩子处理完,这时候如果颜色是白色,那么再去一下父亲节点再回来,就变成黑色了. 如果是1号点,那就去它的孩子节点,再回来,再去它孩子节点. 代码 #include <cstdio> #define N 200005 struct edge{ int to,next; }e[N<<…
题意:询问n个点的每个非叶子点度数恰好等于d的不同构的无根树的数目. n≤1000,d≤10n≤1000,d≤10. 题解: 这题真的是一道非常好的题 首先考虑有根树 定义f[i][j][k]表示i个点,根节点度数为j,最大子树大小为k 转移的时候枚举最大子树以及个数,这样保证了不重构 通过记录了根节点的度数我们就能很好的转移了 DP(n−ik,m−i,k−1)×C(DP(k,d−1,k−1)+i−1,i) f[i+1][I][1]=1 f[1][0][0]=1 初值怎么赋呢 考虑无根的时候 由…