1 条题解
-
0
#include <bits/stdc++.h> using namespace std; template<typename T>void qw(T x) { if(x<0)x=-x,putchar('-'); if(x/10)qw(x/10); putchar(x%10+48); } __int128 a[110][110];//基尔霍夫矩阵 void add(int x, int y){a[x][x]+=1;a[y][y]+=1;a[x][y]-=1;a[y][x]-=1;} /* 任意图的生成树个数: 生成树计数行列式a[i][i] = Di,Di为i的度数; a[i][j] = -k,k为i和j之间的边数。 任去一行一列之后的行列式即为答案。 (往往是去掉第n行第n列) */ int n, m; void gauss() { __int128 ans=1; int r=1; for(int c=1;c<=n;c++) { for(int i=r+1;i<=n;i++) { while(a[i][c]) { __int128 bs=a[r][c]/a[i][c]; for(int j=1;j<=n;j++)a[r][j]=a[r][j]-a[i][j]*bs; swap(a[r],a[i]); ans*=-1; //每次交换两行,将答案取相反数 } } if(a[r][c]!=0)r++; } for(int i=1;i<=n;i++)ans*=a[i][i]; qw(ans); } int main() { scanf("%d%d", &n, &m); memset(a, 0, sizeof(a)); for(int i=1, x, y;i<=m;i++)scanf("%d%d", &x, &y), add(x, y); n--; gauss(); return 0; }
- 1
信息
- ID
- 451
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 69
- 已通过
- 24
- 上传者