uva10766生成樹計數

2022-03-16 00:57:02 字數 1352 閱讀 4681

此類題是給定乙個無向圖,求所有生成樹的個數,生成樹計數要用到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#include

#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;

}

view code

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...