[[清華集訓2012]串珠子]

[清華集訓2012]串珠子


接下來咱們把整道題的主要思路簡要地梳理開來。spa


首先,咱們先考慮最經典的問題(這經典嗎???):get

旅行商問題class

不,是與之相似的一類問題:給一堆點(有順序要求),要求有多少種方案數使這 \(n\) 個點構成一張連通圖(無自環、重邊)。方法

該問題能夠經過一下方法解決:總結

考慮補集轉化思想,將求全部的連通圖的方案轉化爲全部圖的方案\(-\)非連通圖的方案。集合

咱們能夠定義一個 \(dp(S)\) 表明最終答案( \(S\) 表明點集,下同),\(f(S)\) 表明非連通圖的方案,\(g(S)\) 表明總方案數。di

很顯然,在該集合中全部的點構成的徹底圖的的子圖個數是總方案數。co

而對於非連通圖而言,咱們能夠將點集中的點分爲兩部分——一部分爲連通圖、另外一部分瞎搞,只要這兩部分互相不連通就能夠了。display

只不過爲了不重不漏,咱們能夠對於任意一個點,考慮它所在的連通圖的節點個數進行計數。math

最後咱們有:

\[f(S)=\sum dp(S0)*g(S\setminus S0) \]


回到這道題,咱們能夠仿照剛纔的想法,補集轉化去作。只不過咱們這裏的總方案數並非2的整數次冪,而是每條邊種數加一後,全部數的乘積後的結果。

對於補集而言,仍然選任意一個點進行分狀況計數便可。

最後不用卡常就過了。


總結:

  1. 經典狀壓問題的變形;

  2. 補集轉化。

相關文章
相關標籤/搜索