最短路径树上分层dp的一类套路吧

题目大意

幽香这几天学习了魔法,准备建造一个大型的时空传送阵。

幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和从b到a都只需要单位1的时间。

同时这些地点之间在地理上是非常遥远的,因此来往他们必须使用传送门。

现在幽香想要问你,有多少种建造传送门的方案,使得地点1和地点n之间的最短距离恰好为k?两个方案不同当且仅当建造的传送门的集合不同。不能建造节点到自身的传送门,两个点之间也最多造一个传送门。

$n,k \le 100$


题目分析

特殊性质在于每条边长度都为1,这点让人联想到bfs;而看到最短路则自然想起最短路径树。

那么我们就考虑按照bfs序dp这张图的最短路径树,也就是分层往下dp。在分层dp的树中,跨层的点不能连边;邻层及同层的点可以随意连边,最终目标是把$n$号点安排在$k+1$层,如果还有剩下的点则接下去随意安排。

不过这里有一种省去分类讨论的小trick:我们不计标号地计算剩下$n-1$个点的方案数,而由于这$n-1$个点是完全等价的,相当于最后再把总方案数乘以$(n-1)^{-1}$即可。

用$f_{i,t,l}$表示构造了$i$层,总共使用了$t$个节点(包括1号点),当前层有$l$个节点的方案数。转移时枚举上一层有$p$个节点。边界条件$f_{1,1,1}=1$

大致形状如上所示。

考虑p到l的转移:首先从$n-(t-l)$个点中取出$l$个点,取出的每个点向$p$个点连边有$2^p-1$种方案;$l$个点同层连边有$2^{l\choose 2}$种方案。

最后再枚举所有情况统计一趟即可。

 #include<bits/stdc++.h>
#define MO 1000000007
typedef long long ll;
const int maxn = ; int n,k,fac[maxn],facinv[maxn],mi[maxn];
ll f[maxn][maxn][maxn],ans; int qmi(ll a, ll b)
{
int ret = ;
for (a%=MO; b; b>>=,a=1ll*a*a%MO)
if (b&) ret = 1ll*ret*a%MO;
return ret;
}
int C(int n, int m)
{
if (n < m) return ;
return 1ll*fac[n]*facinv[n-m]%MO*facinv[m]%MO;
}
int main()
{
scanf("%d%d",&n,&k);
facinv[] = facinv[] = fac[] = mi[] = ;
for (int i=; i<=; i++)
facinv[i] = MO-1ll*MO/i*facinv[MO%i]%MO;
for (int i=; i<=; i++)
mi[i] = 2ll*mi[i-]%MO, fac[i] = 1ll*fac[i-]*i%MO, facinv[i] = 1ll*facinv[i-]*facinv[i]%MO;
f[][][] = ;
for (int i=; i<=k+; i++)
for (int t=i; t<=n; t++)
for (int l=; l<=t-i+; l++)
for (int p=; p<=t-l-i+; p++)
f[i][t][l] = (f[i][t][l]+1ll*f[i-][t-l][p]*qmi(mi[p]-, l)%MO*C(n-t+l, l)%MO*qmi(, C(l, ))%MO)%MO;
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
if (f[k+][i][j])
ans = (ans+1ll*f[k+][i][j]*j%MO*qmi(, C(n-i, ))%MO*qmi(, 1ll*j*(n-i)%MO))%MO;
printf("%lld\n",1ll*ans*qmi(n-, MO-)%MO);
return ;
}

END

【bfs分层图 dp】hihocoder#1147 : 时空阵的更多相关文章

  1. BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图

    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...

  2. codeforces 677D(分层图dp)

    Codeforces 677D 传送门:https://codeforces.com/contest/677/problem/D 题意: 给你一个n*m的方格图,每个点有一个权值val,现在要求你从坐 ...

  3. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

  4. POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?

    然而我也不知道这是啥啊...反正差不多...哪位大佬给区分一下QWQ.. 好的,我把堆的<写反了..又调了一个小时..你能不能稳一点.... 记录状态:所在位置u,油量c,花费w 扩展状态: 1 ...

  5. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  6. BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP

    BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...

  7. [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)

    传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...

  8. 线性dp,分层图思想

    题目大意:给你一串数字,一串运算符,求递推用完运算符时答案的最大值----->线性dp dp[i][j] i表示所用数字的个数   j表示所用字符的个数 分层图思想 所有字符必须用完 所以取最后 ...

  9. 一本通 高手训练 1782 分层图 状压dp

    LINK:分层图 很精辟的一道题 写的时候没带脑子 导致搞了半天不知道哪错了. 可以想到状压每次到某一层的状态 然后这个表示方案数 多开一维表示此时路径条数的奇偶即可. 不过显然我们只需要知道路径条数 ...

随机推荐

  1. 最新 苏宁java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.苏宁等10家互联网公司的校招Offer,因为某些自身原因最终选择了苏宁.6.7月主要是做系统复习.项目复盘.LeetCode ...

  2. Mybatis之自动生成

    使用Mybatis来自动生成我们的dao接口,mapper文件和实体类. 1.pom.xml依赖: <dependencies> <dependency> <groupI ...

  3. js复制文本

    第一种: 自己测试时 只适合于input 和textarea 但是针对于其他标签的复制就不能用了.代码如下: <!DOCTYPE html> <html> <head&g ...

  4. 2019icpc南昌网络赛

    B. Fire-Fighting Hero (dijstra优先队列+bfs) 题意:刚开始看错题了,以为是k次dijkstra,但是wa了,后来队友指正后发现挺水的.求S到其它点的最短路的最大值an ...

  5. 原生js实现图片的3d效果

    <!doctype html><html lang="en"><head><meta charset="UTF-8"& ...

  6. Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据

    Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...

  7. Kubernetes---Pod hook

    Pod hook(钩子)是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中.可以同时为Pod中的所有容器都配置 hook ...

  8. 【Python基础】14_Python中的TODO注释

    # TODO XXX... IDE中右键左下角,可显示当前项目所有的TODO

  9. selenium模块基础用法详解

    目录 selenium模块 官方文档 介绍 安装 有界面浏览器 无界浏览器 selenium+谷歌浏览器headless模式 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 隐式 ...

  10. linux 对外开放端口

    查看守护进程端口 netstat -ntpl 查看开放的端口 iptables -nvL 查看端口是否可访问:telnet ip 端口号 (如本机的35465:telnet localhost 354 ...