模板 矩陣樹定理

2022-04-29 20:42:15 字數 1243 閱讀 7832

求生成樹個數

定義度數矩陣a,a[i][i]為i號點的度數;鄰接矩陣b,b[i][j]為點i到j的邊數

對於無向圖,用a-b,然後隨意選乙個i,去掉第i行和第i列,它的行列式就是生成樹個數

對於有向圖,外向樹的個數就是把度數矩陣換成入度矩陣;內向樹的個數就是換成出度矩陣;刪掉的行列一定要是根

首先有三條內容:

1.交換矩陣的兩行,行列式取反

2.用矩陣一行加減一行的倍數,行列式不變

3.上三角矩陣的行列式為主對角線元素的積

於是可以高斯消元成上三角矩陣

bzoj4894 天賦(有向圖外向樹個數)

1 #include2 #include3

#define clr(a,x) memset(a,x,sizeof(a))

4#define mp make_pair

5using

namespace

std;

6 typedef long

long

ll;7 typedef unsigned long

long

ull;

8 typedef pairpa;

9const

int maxn=305,p=1e9+7;10

11inline ll rd()

14while(c>='

0'&&c<='

9') x=x*10+c-'

0',c=getchar();

15return x*neg;16}

1718

intn,a[maxn][maxn];

19char

s[maxn];

2021 inline int fpow(int x,int

y)return

re;27}28

29int

main()39}

40 }n--;

41int ans=1;42

for(int i=1;i<=n;i++)

47if(mi!=i) ans*=-1

,swap(a[mi],a[i]);

48for(int j=i+1;j<=n;j++)53}

54}55for(int i=1;i<=n;i++) ans=1ll*ans*a[i][i]%p;

56 printf("

%d\n

",(ans+p)%p);

57return0;

58 }

矩陣樹定理

構建基爾霍夫矩陣,基爾霍夫矩陣的任意乙個代數余子式是所有生成樹的邊權積的和,也就是求的是 sum limits t prod limits v e 基爾霍夫矩陣為度數矩陣減去鄰接矩陣 任意去掉一行一列,所得到的矩陣的行列式即為所求 外向樹為入度矩陣減去鄰接矩陣 內向樹出度矩陣減去鄰接矩陣 刪去根所在...

矩陣樹定理

includeusing namespace std const int n 505 const long long mod 1e4 7 long long det long long a n n int n 0 n 1 求行列式的值 long long tmp 1 for int i 0 i n ...

矩陣樹定理

quad 設無向圖有 n 個節點,拉普拉斯矩陣 l 是乙個 n times n 的矩陣。quad 矩陣構造方法 所有的 l 的值為節點 i 的度數,即有多少邊和節點 i 相連。所有的 l i 不等於 j 的值為節點 i 和 節點 j 之間相連的邊數的相反數 quad 將拉普拉斯矩陣去掉任意的一行和一...