题目描述

有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达。吉丽要给他的三个妹子各开(一个)房(间)。三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽满意,你需要让三个房间两两距离相同。
有多少种方案能让吉丽满意?

输入

第一行一个数n。
接下来n-1行,每行两个数x,y,表示x和y之间有一条边相连。

输出

让吉丽满意的方案数。

样例输入

7
1 2
5 7
2 5
2 3
5 6
4 5

样例输出

5

提示

【样例解释】

{1,3,5},{2,4,6},{2,4,7},{2,6,7},{4,6,7}

【数据范围】

n≤5000

数据范围比较小,考虑O(n2)树形DP。

满足要求的情况一定是一个点往外连出三条链,这三条链的端点就是要选的点。

如果把中间那个点当做根,那么这三个点就分别是根节点3个子树上.

那么我们不妨枚举根节点,对于每个根节点枚举子树统计答案.DP方程是f[i][j]=f[i][j-1]*s[i].

其中f[i][j]表示以当前枚举的点为根时已经选了j个深度为i的点(其中1<=j<=3),s[i]则表示当前枚举的根的子树中深度为i的点的个数。

dfs完根的每棵子树转移时枚举i,j转移。但要注意j要倒序枚举,防止前面状态影响后面状态。

每dfs完一棵子树要清空s数组。最后对于每个点为根节点的答案加和就好了。

#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n;
int x,y;
ll f[5010][4];
int head[5010];
int to[100010];
int next[100010];
int tot;
ll ans;
int s[50010];
int d[50010];
void add(int x,int y)
{tot++;next[tot]=head[x];head[x]=tot;to[tot]=y;
}
void dfs(int x,int fa)
{for(int i=head[x];i;i=next[i]){if(to[i]!=fa){d[to[i]]=d[x]+1;s[d[to[i]]]++;dfs(to[i],x);}}
}
int main()
{scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}for(int i=1;i<=n;i++){memset(d,0,sizeof(d));memset(f,0,sizeof(f));for(int j=1;j<=n;j++){f[j][0]=1;}for(int j=head[i];j;j=next[j]){memset(s,0,sizeof(s));d[to[j]]=1;s[1]++;dfs(to[j],i);for(int k=3;k>=1;k--){for(int l=1;s[l];l++){f[l][k]+=f[l][k-1]*s[l];}}}for(int j=1;f[j][3];j++){ans+=f[j][3];}}printf("%lld",ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9571611.html

BZOJ3522[Poi2014]Hotel——树形DP相关推荐

  1. BZOJ3522 [Poi2014]Hotel 【树形dp】

    题目链接 BZOJ3522 题解 就是询问每个点来自不同子树离它等距的三个点的个数 数据支持\(O(n^2)\),可以对每个距离分开做 设\(f[i][j]\)表示\(i\)的子树中到\(i\)距离为 ...

  2. [POI2014]FAR-FarmCraft 树形DP + 贪心思想

    (感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...

  3. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  4. BZOJ4543 POI2014 Hotel加强版 【长链剖分】【DP】*

    BZOJ4543 POI2014 Hotel加强版 Description 同OJ3522 数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 ...

  5. bzoj4543. [POI2014]Hotel加强版

    bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做. 考虑树形dpdpdp. 设f[i][j]f[i][j]f[i] ...

  6. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  7. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  8. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  9. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

最新文章

  1. Linux磁盘管理:LVM逻辑卷的拉伸及缩减
  2. 中国最大的python社区-python中的最小最大算法
  3. Leetcode之Database篇
  4. WORD列表缩进的文本起始点
  5. hadoop hive 的安装问题
  6. 数学专业毕业,不去做人工智能简直就是在犯罪!
  7. Redis解决秒杀中的超卖问题
  8. 开源Granados介绍 - SSH连接远程Linux服务器(C#)
  9. cop2000计算机组成原理,COP2000计算机组成原理实验系统.pdf
  10. 【地理空间】初识OpenStreetMap
  11. latex大括号 多行公式_怎样在word中快速输入复杂的公式(在线识别数学、物理或化学公式)?...
  12. Linux Deepin 12.12 正式版本发布--焕然一新,即可惊艳!
  13. Storm Windowing(翻译)
  14. python sklearn库silhouette_score轮廓系数接口调用
  15. laravel8 邮件发送 以qq邮箱来举例
  16. SEO技术软件-免费SEO技术工具软件-自动网站优化软件下载
  17. 初级会计实务--第四章第三节、留存收益
  18. [Jquery] ------- input checked选中失效不能渲染效果
  19. 论文笔记_Network in Network
  20. FreeRTOS——优先级翻转

热门文章

  1. lz0-007 读书笔记17
  2. javascirpt如何模仿块级作用域(js高程笔记)
  3. 用css3制作一个搜索框效果
  4. oracle 11g rac 状态,Oracle 11g RAC 检查各部分运行状态
  5. 声音模仿_学唱歌 |唱歌声音难听的解决方法有哪些?这里给你总结总结!
  6. 排序算法之交换排序(冒泡排序、快速排序)
  7. c语言用菜单做计算器,小白求大神帮忙用C语言做个多功能计算器!!!!
  8. oracle链接池满了怎么办,Oracle连接数满了
  9. 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
  10. 重命名Heroku的app