uva10766生成树计数(矩阵树定理)

uva10766生成树计数(矩阵树定理)

 

更正了我之前打错的地方,有边的话G[i][j]=-1;

WA了好多次,中间要转成long double才行。。这个晚点更新。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 typedef long double ld;
 8 
 9 const int N=60;
10 const ld eps=1e-9;
11 int map[N][N];
12 ld G[N][N];
13 
14 ld myabs(ld x){return x>0 ? x:-x;}
15 
16 ld guass(int n)
17 {
18     ld ans=1;
19     for(int i=1;i<=n;i++)
20     {
21         int r=i;
22         for(int j=i+1;j<=n;j++)
23             if(myabs(G[j][i]) > myabs(G[r][i])) r=j;
24         if(r!=i)
25         {
26             for(int j=1;j<=n;j++) swap(G[i][j],G[r][j]);
27             ans*=-1;
28         }
29         if(myabs(G[i][i])<eps) return 0;
30         for(int j=i+1;j<=n;j++)
31             for(int k=n;k>=i;k--)
32                 G[j][k]-=G[j][i]/G[i][i]*G[i][k];
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 n,m,k;
42     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
43     {
44         int x,y;
45         memset(map,0,sizeof(map));
46         memset(G,0,sizeof(G));
47         for(int i=1;i<=m;i++)
48         {
49             scanf("%d%d",&x,&y);
50             map[x][y]=map[y][x]=1;
51         }
52         for(int i=1;i<=n;i++)
53             for(int j=1;j<i;j++)
54                 if(!map[i][j]) 
55                 {
56                     G[i][j]=-1;G[j][i]=-1;
57                     G[i][i]++;G[j][j]++;
58                 }
59         printf("%.0lf\n",(double)guass(n-1));
60     }
61     return 0;
62 }

 

posted @ 2018-09-19 13:30 拦路雨偏似雪花 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值