problem:
給定乙個無向圖,求其不同的生成樹個數
solution:
定義a鄰接矩陣,d度數矩陣,c基爾霍夫矩陣
c=d-a
根據matrix-tree定理:生成樹個數等於基爾霍夫矩陣的n-1階矩陣的行列式絕對值
所以我們的c矩陣只用儲存n-1位
再用guass化成上三角矩陣
對角線的乘積的絕對值就是答案
附上**:
#includeusingnamespace
std;
const
double eps=1e-9
;const
int n=25
;int a[n][n],d[n][n];//
a是鄰接矩陣,d是度數矩陣
double c[n][n];//
c是基爾霍夫矩陣
intn,m;
void
gauss()
for(int j=1;j<=n;j++) swap(c[x][j],c[now][j]);
for(int j=now+1;j<=n;j++)
now++;
}double ans=1
;
for(int i=1;i<=n;i++) ans*=c[i][i];
ans=fabs(ans);
printf(
"%.0lf\n
",ans);
}int
main()
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=d[i][j]-a[i][j];
gauss();
}return0;
}
SPOJ104 Highways,生成樹計數
高速公路 spoj104 highways 乙個有n座城市的組成國家,城市1至n編號,其中一些城市之間可以修建高速公路。現在,需要有選擇的修建一些高速公路,從而組成乙個交通網路。你的任務是計算有多少種方案,使得任意兩座城市之間恰好只有一條路徑?資料規模 1 n 12。生成樹計數 演算法步驟 1 構建...
矩陣樹定理
構建基爾霍夫矩陣,基爾霍夫矩陣的任意乙個代數余子式是所有生成樹的邊權積的和,也就是求的是 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 ...