Matrix-tree定理 spoj HIGH
Matrix-tree定理,给出一个无向图,问求出的生成树方案有多少种方案,利用Matrix-tree定理,主对角线第i行是i的度数,(i,j) 值为i和j之间边的数量,然后删去第一行第一列,利用初等变换求出行列式的绝对值就是答案。
附上代码——by VANE
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n; ll c[13][13],tmp[13]; int main() { int T,m,u,v; ll t,ans; scanf("%d",&T); while(T--) { memset(c,0,sizeof c); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&u,&v); u--;v--; c[u][v]--;c[v][u]--; c[u][u]++;c[v][v]++; } ans=1; for(int i=1;i<n;++i) { for(int j=i+1;j<n;++j) while(c[j][i]) { t=c[i][i]/c[j][i]; for(int k=i;k<n;++k) c[i][k]-=c[j][k]*t; for(int k=i;k<n;++k) swap(c[i][k],c[j][k]); ans=-ans; } ans*=c[i][i]; if(!ans) break; } ans=max(ans,-ans); printf("%lld\n",ans); } }
UPD:对于有向图而言
1、无向图中是双向边,所以一条边(u,v)会使度数矩阵的(u;u)和(v;v)元都加一,现 在变成有向图,只让其中一个加一即可。
2、同理,邻接矩阵也从(u;v)元和(v;u)加一变成其中一个加一。
3、基尔霍夫矩阵还是度数减邻接。
4、无向图是任意删去一行一列,有向图中是删除“根节点”所在行列求 行列式。
生命中真正重要的不是你遭遇了什么,而是你记住了哪些事,又是如何铭记的。