首页 > 其他分享 >【P2109 [NOI2007]】 生成树计数(状压 dp + 矩阵快速幂)

【P2109 [NOI2007]】 生成树计数(状压 dp + 矩阵快速幂)

时间:2023-03-16 12:56:36浏览次数:78  
标签:状态 连通 P2109 sta 连边 状压 矩阵 NOI2007 dp

状压 dp + 矩阵快速幂优化。

感觉题解区几篇题解说得云里雾里的……也没有一定的证明……

Link.

Solution

Part1 dp 状态设计

发现 \(k\) 的范围很小,具有很强的指向性——状压 dp。

结合题面,发现一个点 \(i\) 只可能和 \(j\in (i-k,i)\) 的点连边,即 \(i-k+1\) 之前的点我们根本不用考虑它和 \(i\) 的连接情况,我们只需要保证 \([1,i-k]\) 这些点连通即可。

故可以设计状态 \(f(i,sta)\) 表示当前考虑到点 \(i\),且 \((i-k,i]\) 这 \(k\) 个点的连通状态为 \(sta\) 时,生成树的方案数。

因为最后要求的是生成树,而生成树的必要条件是 \([1,n]\) 都是连通的。所以我们每次从 \(f(i-1,sta')\) 转移到 \(f(i, sta)\) 时,都要保证 \(i-k\) 和 \(j\in (i-k,i]\) 中的任何一个点是连通的

为什么这样就可以保证 \(f(n,sta_{final})\) 的方案数(其中 \(sta_{final}\) 代表 \((n-k,n]\) 都连通的状态)都是合法的(即 \([1,n]\) 都是连通的)?

此处口胡一个反证法。易知,若 \([1,n]\) 不连通,即有若干个连通块,那我们一定可以找到某个连通块中,编号最大的节点 \(i\),满足它和 \((i,i+k]\) 一定都不连通。故我们如果保证了转移时每一个 \(i-k\) 和 \(j\in (i-k,i]\) 中的任何一个点是连通的,那这个图最终一定就是一个连通图。

Part2 状态压缩

然后考虑状态中 \(sta\) 的表述。

其余众多题解都提及了,我们可以使用最小表示法,将每种 \(k\) 点连接状态都表示出来。具体地,给同一个连通块中的点都赋上同一数值即可,不同连通块数值不同即可。

对于每种连接状态,预处理 dfs() 出来即可,状态总数不超 \(60\)。

Part3 dp 状态转移

考虑状态转移。

记 \(g[sta'][sta]\) 表示从状态 \(sta'\) 转移到 \(sta\) 的方案数。即,对于一个待转移的点 \(i+1\),它可以通过 \(g[sta'][sta]\) 种方案,和 \(j\in [i - k+2,i]\) 的点连边,使得原先 \([i-k+1,i]\) 这些点构成的状态 \(sta'\),能转变为现在 \((i-k+1,i+1]\) 这些点构成的状态 \(sta'\)。

如何保证最终答案的合法性?易知生成树一定是一个无环的连通图。连通性的保证在 Part1 中已经讲解了,现在保证图中一定不出现环。所以我们在两两状态转移的时候一定要注意不能出现环,否则当前状态不合法。

那么存在一个十分显然的转移:

\[f(i,sta)=\sum_{sta'} f(i-1,sta')\times g(sta',sta) \]

然后仔细观察,会发现这个形式实际上是矩阵乘法的形式。故我们在求出了 \(g[][]\) 之后,可以使用矩阵快速幂求出最终方案数。

进一步地,不难得出可以省去 \(f\) 的第一维。因矩阵快速幂的使用,\(f\) 可简化为 \(f(1,sta)\)。

Part4 \(f\) 数组初始化

注意,\(f\) 不能直接采用 dfs() 中暴力推出来的状态种类进行初始化。

原因是不同的连边方式可能导致同样的连通状态。

故,我们这样初始化 \(f\):对于前 \(k\) 个点,一共有 \(\dbinom{k}{2}\) 条边,而对于每条边,我们可以选择连或不练,故一共有 \(2^{\frac{k\times (k-1)}{2}}\) 中连边方式。对于每种连边方式,我们直接暴力连边,使用并查集维护连通性,即可得到最终连通状态。

总复杂度可过。


Thanks for reading.

标签:状态,连通,P2109,sta,连边,状压,矩阵,NOI2007,dp
From: https://www.cnblogs.com/gsn531/p/17222142.html

相关文章

  • 2023.3.14 状压 dp 模拟赛题解
    好强啊。不说是谁了,都好强啊呜呜呜。   首先T1的一个优化luoguP1842奶牛玩杂技,需要一个贪心排序来优化序列顺序。关于贪心排序:像这样有两种及以上性质的序列,......
  • BZOJ 4145 [AMPPZ2014]The Prices (状压DP)
    题意你要购买商店,你到第i家商店的路费为,在第家商店购买第种物品的费用为,求最小总费用。分析很容易定义出状态,表示到第行,买的物品情况为的最小费用。按照往常的套路是转移时......
  • HDU 5418 Victor and World 状压DP的TSP问题
     VictorandWorldTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:262144/131072K(Java/Others)TotalSubmission(s):1855    AcceptedSubmission......
  • 状压 DP(ZR)
    [PKUSC2018]最大前缀和从部分分出发考察性质,“满足a中至多一个负数”怎么做?好吧这个很简单,但是它提醒我们从负数的POV考虑。不难发现,最大前缀和的结束为止一定是某个......
  • [HNOI2007]梦幻岛宝珠
    题意:01背包,但空间巨大。观察到每个 w_iwi​ 能写成 a*2^b (a,b∈N) 的形式,于是可以先把b相同的宝珠做一次合并,随后再进行总的合并。b相同的宝珠合并时直接可以使......
  • 状压 DP
    概述状压DP是以状态含有某种意义上的状态压缩为特点的一类DP。所谓状态压缩,通常指的是将各个元素的状态从常规的vector等编码映射为一个\(id\)即抽象的状态。......
  • 【题解】P4027 [NOI2007] 货币兑换
    题意好长,但是不想概括了。\cdq/!思路cdq分治+凸包。首先考虑令\(f_i\)表示第\(i\)天可以得到的最大金额,\(f_1=s\)因为\(rate_i\)是常数,并且保证存在最优方......
  • 【新生寒训】day 10 状压dp2
    【新生寒训】day10状压dp2果咩纳塞米娜桑!!!!我选的太难了......
  • #2153. 「SCOI2005」互不侵犯(状压DP)
    #2153.「SCOI2005」互不侵犯解题思路令dp[i][j][k]表示第i行的状态为j时,共放置k个国王的方案数。状态j的二进制即表示该行的放置方式,例如j为3时,放置的方式为101,即从右......
  • 2021年蓝桥杯A组省赛-回路计数 【状压dp】
    题面分析单源最短Hamilton路径的状压dp模板题。\(dp[i][j]\)表示终点为\(j\),经过的点集状态为\(i\)的方案数。假设状态由\(k\)转移到\(j\)。当前计算\(dp[i][j]\),那么i......