生成樹計數問題的簡單推廣

2022-05-15 23:37:16 字數 1347 閱讀 9841

第乙個推廣: 在生成樹計數問題中,其實我們做了這樣乙個假設,就是每條邊的權值是1。我們再來看下這個公式

對於關聯矩陣b來說(對於乙個n個頂點m條邊的無向圖g,它的關聯矩陣b是乙個n*m的矩陣。對於第i條邊e[i]=(u,v),那麼b[u][i]和b[v][i]中乙個是1,乙個是-1,第i列其他值為0),我們可以這樣看,對於頂點(u,v) 之間若有邊 e[x]=(u,v),那麼b[u][x]=1,b[v][x]=-1,x列其他值為0。那麼,現在我們設邊(u,v)的權值為w(我們這裡認為w非負,沒有邊的時候w=0),那麼其實b滿足下面的式子

那麼按照這個樣子,$det(c_)$它計算出的是

其中

最後對於

也能構造出乙個上三角矩陣,對角線分別是到它父節點的邊的權值。

第二個推廣:我們來求帶權無向圖的最小生成樹的個數。如果圖的權值都是相同的,那麼直接使用matrix-tree定理計算即可。對於不是這樣情況的,我們可以這樣解決。首先將邊權公升序排序,這樣權值相等的邊就排到了一起。然後,相等權值的邊劃分為一組。我們按照組一組一組處理。

在這裡有這樣乙個性質,設在某一種最小生成樹中邊權為w的邊使用了x條,那麼在所有型別的最小生成樹中,邊權為w的邊都必然使用了x條,並且這x條邊加上之前權值小於w的邊中選出的一些邊加入後圖的聯通狀態不變。首先我們來證明聯通狀態不變。首先,我們假設在權值為w的邊處理之前,處理完權值小於w的邊之後,形成的聯通塊數為c1,加入權值為w的x條邊之後聯通塊數為c2,顯然c2=c1-x。那麼不管權值為w的邊你選多少條如何選,之後聯通塊數都不會比c2更小了,要是更小,說明我們c2求錯了。要是比c2大,那麼這不是最優的情況,因為對於某兩個未聯通的塊,現在讓他倆聯通一定比之後讓他倆聯通優,因為後面的權值越來越大。接著我們證明,使用的邊的數量一定是x,這也很顯然,c1,c2都是固定的,聯通塊數減少了c1-c2,所以一定用了這麼多邊,不能多也不能少。

有了這個性質,我們對於每個階段,我們將這個階段之前的聯通到一起的點看做乙個點,那麼權值為w的所有邊加入後,就成了一些聯通塊,每個聯通塊內邊的權值都一樣,所以可以使用matrix-tree 定理搞一次,所有的聯通塊的乘起來即可。而每個階段是獨立的,乘起來就是最後答案。

生成樹計數問題

題目描述 給你乙個n個點,m條邊的無向圖,求其生成樹個數。1 n 12 分析 由於原問題規模較小,可以使用複雜度較高的演算法,如指數級的動態規劃。那麼如果n 1000呢?基爾霍夫矩陣 對於無向圖,它的kirchhoff矩陣定義為度數矩陣減去鄰接矩陣。在計算時,用a表示kirchhoff矩陣。則 當i...

codeforces 簡單計數問題收集

開個新坑。所謂簡單計數問題,就是運用組合數學或者一些計數技巧,去統計某個物件的個數。這些題往往碼量不大,思路靈活。如果這方面的 直覺 很強的話,解題會很輕鬆。容易想到的是,給定乙個區間,在 nlogn 內求出其 good pairs 的計數。即對 first 維護 i rev i 的個數。然後列舉 ...

關於 NSString 的引用計數問題

nsstring str1 aaa nslog lu p unsignedlong str1 retaincount str1 nsstring str2 nsstringalloc initwithstring aaa nslog lu p unsignedlong str2 retaincoun...