矩陣樹定理

2022-09-21 15:09:10 字數 2053 閱讀 9680

\(\quad\)設無向圖有 n 個節點,拉普拉斯矩陣 l 是乙個 \(n\times n\) 的矩陣。

\(\quad\)矩陣構造方法:

所有的 \(l_\) 的值為節點 \(i\) 的度數,即有多少邊和節點 \(i\) 相連。

所有的 \(l_\) ( \(i\) 不等於 \(j\) )的值為節點 \(i\) 和 節點 \(j\) 之間相連的邊數的相反數

\(\quad\)將拉普拉斯矩陣去掉任意的一行和一列,得到的矩陣求行列式,就是原圖的生成樹數量

(證明我也不會)

\(\quad\)知道了定理,如何求解行列式就成了問題的關鍵。

\(\quad\)首先我們需要行列式的性質:

\(\quad\)那麼我們就可以利用高斯消元的思想將矩陣消成三角矩陣,然後將對角線的數字乘起來就是矩陣的行列式。

\(\quad\)因為有分數,會有浮點誤差,所以我們用沒有誤差的輾轉相除法。

\(\quad\)如果原圖有邊權:

\(\quad\)定義乙個節點的度數為和它相連的邊權和,\(l_\) 的值為邊 \((i,j)\) 的邊權的相反數

\(\quad\)那麼這時候按矩陣樹定理求出的值為所有生成樹(包含的所有邊)的乘積的和,即:

\[\sum _ \prod_ w_e

\]t1 小 z 的房間

luogu p4111 [heoi2015]小 z 的房間

#include#define int long long

using namespace std;

char ch[20][20];

const int mod=1000000000;

int n,m,cnt,ans=1,id[20][20],a[100][100];

void add(int x,int y)

signed main()

cnt--;

for(int i=1;it2 最小生成樹計數

luogu p4208 [jsoi2008]最小生成樹計數

#include#define il inline

#define re register

using namespace std;

const int n=101,m=1001,mod=31011;

struct edgetp[m],mst[m];

vectore[m];

int cmp(edge a,edge b)

bool is[m];

int fa[n],bel[n];

void init(int a)

il int find(int u)

il bool uni(int a,int b)

int n,deg[n][n],g[n][n],mat[n][n];

il int read()

while(isdigit(ch))

return f?-ret:ret;

}il int treecnt()

if(mat[i][i]==0) return 0;

} ans=1ll*ans*mat[i][i]%mod;

} return (ans+mod)%mod;

}int main()

sort(tp,tp+b,cmp);

for(re int i(0);iif(cnt!=a-1) return printf("0"),0;

int ans=1;

for(re int i(1);i<=tl;++i)

for(re int j(1);j<=a;++j)

for(re int j(1);j<=a;++j) bel[j]=bel[find(j)];

for(re int j(0);jfor(re int j(1);j<=n;++j)

for(re int k(1);k<=n;++k)

mat[j][k]=deg[j][k]-g[j][k];

ans=ans*treecnt()%mod;

for(re int j(0);j} printf("%d",ans);

return 0;

}

矩陣樹定理

構建基爾霍夫矩陣,基爾霍夫矩陣的任意乙個代數余子式是所有生成樹的邊權積的和,也就是求的是 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 ...

模板 矩陣樹定理

求生成樹個數 定義度數矩陣a,a i i 為i號點的度數 鄰接矩陣b,b i j 為點i到j的邊數 對於無向圖,用a b,然後隨意選乙個i,去掉第i行和第i列,它的行列式就是生成樹個數 對於有向圖,外向樹的個數就是把度數矩陣換成入度矩陣 內向樹的個數就是換成出度矩陣 刪掉的行列一定要是根 首先有三條...