1. 程式人生 > >樹專題---連通域問題

樹專題---連通域問題

樹專題—連通域問題

在acm競賽樹型問題中,經常會遇到與連通域相關問題。將樹拆成m個連通塊的方案數或者統計包含節點i的連通域的數目。在此,我們對此類問題進行總結。

型別一: 拆成m個互斥連通域

題意:樹拆成m個互斥且不為空的連通域,拆有時間次序,問拆的不同方案總數。
分析:如果沒有什麼經驗,這道題一時半會還真想不到什麼辦法解決。當然靈感來
了,很快就能解決,這道題就是一道公式題。有根樹,每個節點都僅有一個根節點
我們切斷一條邊uv,原連通域基礎上增加一個以v為根的樹(連通域),即在n-1條邊
中選m-1條邊,即會增加m-1塊以所有邊的子節點為根的樹(連通域).                     

=Cn1m1×m!=m×x=nm+1n1x(mm)方案總數 = C_{n-1}^{m-1} \times m! = m\times\prod_{x=n-m+1}^{n-1}x(m塊拆是有序的,所以排序m!)

#include <iostream>
#include <algorithm>
#include <stdio.h>
#define llt long long
using namespace std;

const
llt mod = 1e9+7; int main(){ int T; cin>>T; while(T--){ int n,m; cin>>n>>m; int u,v; for(int i=1;i<n;++i) cin>>u>>v; llt ans = m; for(int i=n-m+1;i<n;++i) ans =
ans * i %mod; cout<<ans<<endl; } return 0; }