此類題是給定乙個無向圖,求所有生成樹的個數,生成樹計數要用到matrix-tree定理(kirchhoff矩陣-樹定理)
g的度數矩陣d[g]是乙個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i=j時,dij等於vi的度數
g的鄰接矩陣a[g]也是乙個n*n的矩陣, 並且滿足:如果vi、vj之間有邊直接相連,則aij=1,否則為0
我們定義g的kirchhoff矩陣(也稱為拉普拉斯運算元)c[g]為c[g]=d[g]-a[g],則matrix-tree定理可以描述為:g的所有不同的生成樹的個數等於其kirchhoff矩陣c[g]任何乙個n-1階主子式的行列式的絕對值。所謂n-1階主子式,就是對於r(1≤r≤n),將c[g]的第r行、第r列同時去掉後得到的新矩陣,用cr[g]表示。
證明:因為基爾霍夫矩陣i!=j處要麼是0,要麼是-1,這樣處理起來就很方便
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define min(a,b) ausing
namespace
std;
const
double g=10.0,eps=1e-9
;const
int n=50+10,maxn=500000+10,inf=0x3f3f3f3f
;ll d[n];
ll a[n][n];
ll solve(
intn)
}if(a[i][i]==0)return0;
ans*=a[i][i];
}if(ans<0)ans=-ans;
return
ans;
}int
main()
while(m--)
for(int i=1;i<=n;i++)
for(int j=1+i;j<=n;j++)
if(a[i][j])
d[i]++,d[j]++;
for(int i=1;i<=n;i++)
}/*for(int i=1;i<=n;i++)
return0;
}
uva 10766 生成樹計數
給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。這道題的k沒有什麼用。include include include include include include include include include incl...
生成樹計數 UVA 10766
1 本題題意 首先每個點之間都可達,然後m列舉出不可達的,求出最多的生成樹方案 2 k這個變數是沒用的。3 公式 ans矩陣 度矩陣 建邊矩陣 4 度矩陣是當i j時的,建邊矩陣於平時定義可達矩陣相同 5 include6 include 7 include8 include9 using name...
清華集訓2017 生成樹計數
在乙個 s 個點的圖中,存在 s n 條邊,使圖中形成了 n 個連通塊,第 i 個連通塊中有 a i 個點。現在我們需要再連線 n 1 條邊,使該圖變成一棵樹。對一種連邊方案,設原圖中第 i 個連通塊連出了 d i 條邊,那麼這棵樹 t 的價值為 mathrm t left prod m right...