1. 程式人生 > 其它 >AT3617 Unicyclic Graph Counting 題解

AT3617 Unicyclic Graph Counting 題解

主要提供一個推導的思路

前提概要:

在做這道題之前可以先做一下P2290 [HNOI2004]樹的計數主要是來熟悉一個定理:

對於給定度數為\(d_{1\sim n}\)的一棵無根樹共有\(\dfrac{(n-1-1)!}{\prod_{i=1}^n (d_i-1)!}\)種情況。

因為度數為\(d_i\)的結點會在\(prufer\)序列中出現\(d_i-1\)次,實際上就是多重集合的全排列。

正文

先不看環

也就是感性理解將環縮為一個點,那麼就是一棵樹。

設環的大小為\(L\),根據前提概要中的公式,那麼
共有\(\dfrac{(n-L-1)!}{\prod_{i=1}^n (d_i-1)!}\)

種情況。

根據圓排列的公式,從\(n\)個不同元素中不重複地取出\(m(1 \le m \le n)\)個元素在一個圓周上,叫做這\(n\)個不同元素的圓排列。如果一個\(m\)圓排列旋轉可以得到另一個\(m\)圓排列,則認為這兩個圓排列相同。特別地,當\(m=n\)時,\(n\)個不同元素作成的圓排列總數為\((n-1)!\)

但是,因為這是在一棵樹上,所以不能根據某種對稱性(可以感性理解下),需要對圓排列總數\(/2\),即\(\frac{(n-1)!}{2}\)

那麼對於環,

不難發現環的大小一共可能為\(3\sim n-1\)種。

同時根據特殊性質,根據在\(prufer\)序列中出現次數與給出度數關係,有三種不同的點:

普通樹上的點出現\(d_i-1\)次。

環上的普通點出現\(d_i-2\)次。

環上的某一個點出現\(d_i-3\)次。

綜合起來

\(ans=\sum_{L=3}^{n-1} \dfrac{(n-L-1)!}{\prod Di!}\dfrac{(L-1)!}{2}\)

其中\(Di\)表示根據三種不同點的出現次數(前文已經提及),\(i\)的範圍由環的點集範圍決定(後面會講如何遞推)。

對於一個大小為\(L\)的環,很明顯可以先預處理出
\(\dfrac{(n-L-1)!(L-1)!}{2}\)

至於\(\dfrac{1}{\prod Di!}\)可以用類似與樹的計數遞推組合數的思想,

設計狀態 \(f_{i,j,k}\),其中$i,j,k \(表示\)i\(個點中,環上有\)j\(個點,已有\)k$個特殊環節點。

感覺別的題解應該對於狀態的轉移講得比較清楚,那麼本篇就補充一下狀態的設計思路(即如何想到的):

根據點的分類和特殊性考慮設計三維的狀態,毫無疑問第一維需要統計一共用了多少個點,又因為環套樹中環的特殊性,以及統計方式的不同,可以設計出第二維為環上選了多少個點,再根據環上特殊點的特特特殊性,用\(0/1\)判斷是不是即可。

最後根據轉移即可統計出\(\sum_{L=3}^{n-1}f_{n,i,1}\)

最後,記得用逆元。