Organising the Organisation UVA

Organising the Organisation

UVA - 10766

生成树计数

要用到Matric-Tree定理。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 const int maxn = 52;
 5 const long double eps = 1e-8;
 6 long double a[maxn][maxn];
 7 int vis[maxn][maxn];
 8 int dcmp(long double x){
 9     if(fabs(x) < eps) return 0;
10     return x < 0 ? -1 : 1;
11 }
12 long double solve(long double a[][maxn], int n){
13     long double ans = 1;
14     int cnt = 0;
15     for(int i = 0; i < n; i++){
16         if(dcmp(a[i][i]) == 0){
17             int j;
18             for(j = i + 1; j < n; j++){
19                 if(!dcmp(a[j][i])) break;
20             }
21             if(j == n){
22                 return 0;
23             }
24             for(int k = i; k < n; k++){
25                 swap(a[i][k], a[j][k]);
26             }
27             cnt++;
28         }
29         ans *= a[i][i];
30         for(int j = i + 1; j < n; j++){
31             long double ta = a[j][i] / a[i][i];
32             for(int k = i; k < n; k++){
33                 a[j][k] -= ta * a[i][k];
34             } 
35         }
36     }
37     if(cnt & 1) ans = -ans;
38     return ans;
39 }
40 
41 int main(){
42     int n, m, k;
43     while(scanf("%d %d %d", &n, &m, &k) != EOF){
44         memset(vis, 0, sizeof(vis));
45         memset(a, 0, sizeof(a));    
46         for(int i = 0; i < m; i++){
47             int u, v;
48             scanf("%d %d", &u, &v);
49             u--;
50             v--;
51             vis[u][v] = vis[v][u] = 1;
52         }
53         for(int i = 0; i < n; i++){
54             for(int j = 0; j < n; j++){
55                 if(!vis[i][j] && i != j){
56                     a[i][i]++;
57                     a[i][j] = -1;
58                 }
59             }
60         }
61         printf("%.0f
", (double)solve(a, n-1));
62     }    
63 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7860295.html