uva -- 10766

 

 

一开始我感觉是模板题  是不想写的 后来发现我的模板上没有 就敲了一遍

 

   可以忽略这句屁话     在信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及。事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用。

 

  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\n",ans);
114     }
115 
116 }
代码君

 

posted on 2015-06-10 21:48  yifi  阅读(269)  评论(0编辑  收藏  举报

导航