\(\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列,它的行列式就是生成樹個數 對於有向圖,外向樹的個數就是把度數矩陣換成入度矩陣 內向樹的個數就是換成出度矩陣 刪掉的行列一定要是根 首先有三條...