HC1147 时空阵
问1号点到n号点距离恰好为m的图的个数。图的边权为1。\(n,m ≤ 100\)
DP+图论。怎么说呢,还是图论的思想多一点,因为涉及到分层的思想。
我们可以将到1距离不同的点分层,例如1在第零层,那么与1距离为1的点就在第1层,以此类推,到1距离为\(k\)的点在第\(k\)层。
这就是BFS树,也就是说,从1号点开始bfs,对于一个点i,他在BFS中的父亲就是他在BFS树中的父亲。BFS树有一些性质,比如这棵树中非树边只存在与同一层中或者上一层与这一层之间,读者自证,反证即可。
我们发现,对于已经确定第i层的BFS树,第i+1层对第i层的构造无影响,也就是说,枚举构造时无后效性,再看看数据范围,不是明显的排列组合递推dp么?
不妨设\(f[i][j][k]\),表示这是第\(i\)层,总共已经用了\(j\)个点,其中这一层有\(k\)个点的方案数。对于一个\(f[i][j][k]\),显然要从\(f[i-1][j-k][s]\)中转移出来。
首先分层图内部可以随便连边,也就是说已经有了\(2^{C^2_k}\)种可能性。
其次,对于分层图上除了根节点之外的每个点,必须要与上一层连接至少一条边(不然怎么会在这一层),当然和上一层多连几条也没问题,也就是说还有\({(\sum^{s}_{p=1}C_{s}^{p})}^k={(2^s-1)}^k\)种情况
最后,大家都知道但非常容易忽略的是,点序不是BFS序,也就是说,没有人规定下一层的点的序号必须要比上一层小,也没有人规定第n号点必须在最后一层。于是,我们还需要去枚举什么点放在这一层,这一层结束之后我们还有\(n-j\)个点,所以这次结束之前我们有\(n-j+k\)个点,所以我们在这一层中有\(n-j+k-1\)个点供我们选出k个点,注意下这里的"-1"是怎么来的,我们还要保证第n号点不能放进这一层。
处在第m层的话情况比较特殊,同样还是在\(n-j+k-1\)个点中去选,我们不能再选\(k\)个点,而是要去选\(k-1\)个,因为要留一个位置给\(n\)号点。
转移式推出。
还有一件事情需要处理,就是当第\(n\)层处理完了之后剩下的点怎么办。直接把全部形态都乘上就好。
首先就是剩下的点之间随便连,就是\(2^{C_{n-i}^{2}}\)种,他们也可以选择要不要和这一层连,就是\(2^{j(n-i)}\)种。
答案处理式出来了。
注意一个不错的性质就是\(C^2_k=\frac{k(k-1)}{2}\),同时2的多个幂也可以合并加快速度,还要注意取\(mod\)防止溢出。
就说到这里吧,祝自己生日快乐哈哈哈。

浙公网安备 33010602011771号