orz,感覺對最小生成樹的理解又加進了一步。ps:不得不說對於經典演算法的**是永無止境的,只能通過交流和增長見識來學習和體會,自己研究確實困難。
讓我們來深入分析一下kruskal演算法。演算法過程不多說,直接證明:假設演算法考慮到第k條邊,這時發現邊的兩端已經在同乙個連通塊裡面了(稱為「衝突」),為了使這條邊加入這個連通塊之後仍然保持樹的性質,我們定要從成的環上刪去一條邊,而之後連通性並未發生改變,但由於刪去的邊權不大於當前邊權,所以答案不會更優,證畢。
對於這道題,我們要看到通過kruskal演算法求最小生成樹的過程的分析得出的乙個性質:如果相同權的邊c有k條,那麼在考慮下一種邊權時,不同的加入法被加入連通狀態的邊c數量相同,且點的連通狀態相同。即:乙個圖的最小生成樹相同邊權的邊的數量一定相等,且加入這些邊之後形成的連通狀態也相同。證明:將相同的邊權分成乙個加邊階段,對於當前階段的邊c設其有k條。假設在考慮到k中的第t條時發生了衝突,有兩種情況:若形成的環中有之前加入過的c邊,那麼可以將其替換從而連通狀態不會改變;若沒有,當前k值邊不能加入且之後的k值邊也無法加入。上述兩種情況都不會增加加入邊的數量和改變連通狀態,得證。
所以就愉快的kruskal暴力並查集維護連通性+搜尋,每個階段可能的加邊方案數累乘起來就行了。注意特判無解情況(因為上述做法會在無解時輸出1)。**網上多的是23333。matrix-tree定理貌似用不了啊??求神犇(特指ydc)講解2333.
1016 JSOI2008 最小生成樹計數
description 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的 最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生 成樹可能很多,所以你只需要輸出方案數對31011的模就可以了。input 第一行...
bzoj1016 JSOI2008 最小生成樹計數
description 現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的 最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生 成樹可能很多,所以你只需要輸出方案數對31011的模就可以了。input 第一行...
bzoj1016 JSOI2008 最小生成樹計數
現在給出了乙個簡單無向加權圖。你不滿足於求出這個圖的最小生成樹,而希望知道這個圖中有多少個不同的最小生成樹。如果兩顆最小生成樹中至少有一條邊不同,則這兩個最小生成樹就是不同的 由於不同的最小生成樹可能很多,所以你只需要輸出方案數對31011的模就可以了。第一行包含兩個數,n和m,其中1 n 100 ...