spoj104 highways 生成树计数(矩阵树定理)

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 }

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值