spoj104 highways 生成树计数(矩阵树定理)
https://blog.csdn.net/zhaoruixiang1111/article/details/79185927
为了学一个矩阵树定理 从行列式开始学(就当提前学线代了。。
矩阵数定理:
截图来自于上述论文
裸题。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 const int N=20; 8 const double eps=1e-9; 9 double G[N][N]; 10 11 double myabs(double x){return x>0 ? x:-x;} 12 13 double guass(int n) 14 { 15 double ans=1; 16 for(int i=1;i<=n;i++) 17 { 18 int r=i; 19 for(int j=i+1;j<=n;j++) 20 if(myabs(G[j][i])>myabs(G[r][i])) r=j; 21 if(r!=i) 22 { 23 for(int j=1;j<=n;j++) swap(G[i][j],G[r][j]); 24 ans*=-1; 25 } 26 if(G[i][i]==0) return 0;//一开始忘了判断,WA了好几发 27 for(int j=i+1;j<=n;j++)//row 28 { 29 for(int k=n;k>=i;k--)//col 30 G[j][k]-=G[j][i]/G[i][i]*G[i][k]; 31 } 32 } 33 34 for(int i=1;i<=n;i++) ans*=G[i][i]; 35 return myabs(ans); 36 } 37 38 int main() 39 { 40 //freopen("a.in","r",stdin); 41 int T; 42 scanf("%d",&T); 43 while(T--) 44 { 45 int n,m; 46 scanf("%d%d",&n,&m); 47 memset(G,0,sizeof(G)); 48 for(int i=1;i<=m;i++) 49 { 50 int x,y; 51 scanf("%d%d",&x,&y); 52 G[x][x]++;G[y][y]++; 53 G[x][y]=-1;G[y][x]=-1;//不是--,而是直接等于-1 54 } 55 printf("%.0lf\n",guass(n-1)); 56 } 57 return 0; 58 }