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  拦路雨偏似雪花  阅读(182)  评论(0编辑  收藏  举报