一开始我感觉是模板题 是不想写的 后来发现我的模板上没有 就敲了一遍
可以忽略这句屁话 在信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及。事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用。
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <math.h> 11 #include <stdlib.h> 12 #include <time.h> 13 14 using namespace std; 15 16 const double eps = 1e-8; 17 const int MAXN = 110; 18 int sgn(long double x) 19 { 20 if (fabs(x)<eps) 21 { 22 return 0; 23 } 24 if (x<0) 25 { 26 return -1; 27 } 28 else 29 { 30 return 1; 31 } 32 } 33 34 35 long double b[MAXN][MAXN]; 36 long double det(long double a[][MAXN],int n) 37 { 38 int i,j,k,sign = 0; 39 long double ret = 1; 40 for (i = 0;i<n;i++) 41 { 42 for (j = 0;j<n;j++) 43 { 44 b[i][j] = a[i][j]; 45 } 46 } 47 for (i = 0;i<n;i++) 48 { 49 if (sgn(b[i][i]==0)) 50 { 51 for (j = i+1;j<n;j++) 52 { 53 if (sgn(b[j][i])!=0) 54 { 55 break; 56 } 57 } 58 if (j==n) 59 { 60 return 0; 61 } 62 for (k = i;k<n;k++) 63 { 64 swap(b[i][k],b[j][k]); 65 } 66 sign++; 67 } 68 ret *= b[i][i]; 69 for (k = i+1;k<n;k++) 70 { 71 b[i][k]/=b[i][i]; 72 } 73 for (j = i+1;j<n;j++) 74 { 75 for (k = i+1;k<n;k++) 76 { 77 b[j][k] -= b[j][i]*b[i][k]; 78 } 79 } 80 } 81 if (sign&1) ret = -ret; 82 return ret; 83 } 84 long double a[MAXN][MAXN]; 85 int g[MAXN][MAXN]; 86 int main() 87 { 88 int n,m; 89 int u,v; 90 int k; 91 while (~scanf("%d%d%d",&n,&m,&k)) 92 { 93 memset(g,0,sizeof(g)); 94 while (m--) 95 { 96 scanf("%d%d",&u,&v); 97 u--; v--; 98 g[u][v] = g[v][u] = 1; 99 } 100 memset(a,0,sizeof(a)); 101 for (int i = 0;i<n;i++) 102 { 103 for (int j = 0;j<n;j++) 104 { 105 if (i!=j&&g[i][j]==0) 106 { 107 a[i][i]++; 108 a[i][j] = -1; 109 } 110 } 111 } 112 double ans = det(a,n-1); 113 printf("%.0lf ",ans); 114 } 115 116 }