SPOJ - HIGH Highways(矩阵树定理)
2024-10-16 18:29:08
https://vjudge.net/problem/SPOJ-HIGH
题意:
给n个点m条边,求生成树个数。
思路:
矩阵树裸题。
具体的话可以看一下周冬的论文《生成树的计数及其应用》。
简单说一下,$A[ ][ ]$为邻接矩阵,有边为1(其实也就是边的个数,有重边时要注意),无边为0。$D[ ][ ]$为度数矩阵,$i=j$时为1,否则为0。
$C[ ][ ]$为关联矩阵,$C[ ][ ]=D[ ][ ]-A[ ][ ]$。
最后解任意n-1阶的主子式即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+; int n,m;
double C[maxn][maxn];
int A[maxn][maxn],D[maxn][maxn]; double Gauss()
{
for(int k=; k<=n; k++) //k表示当前行数,因为行数与列数一样,所以这里k也代表了列数
{
int max_r=k;
for(int i=k+;i<=n;i++)
if(fabs(C[i][k])>fabs(C[max_r][k])) max_r=i;
if(C[max_r][k]==) return ; //有一列为0,行列式的值必为0
if(max_r!=k)
{
for(int j=k;j<=n;j++)
swap(C[k][j],C[max_r][j]);
}
for(int i=k+;i<=n;i++)
{
double tmp=C[i][k]/C[k][k];
for(int j=k;j<=n;j++)
C[i][j]-=tmp*C[k][j];
}
}
double ans=;
for(int i=;i<=n;i++) ans*=C[i][i]; //化为三角阵后计算主对角线元素乘积
ans=fabs(ans);
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
memset(A,,sizeof(A));
memset(D,,sizeof(D));
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
D[u][u]++; D[v][v]++;
A[u][v]++; A[v][u]++;
}
n--;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
C[i][j]=D[i][j]-A[i][j];
printf("%.0lf\n",Gauss());
}
return ;
}
最新文章
- 杀死当前Excel进程
- PHP学习笔记二十三【This】
- Hibernate: merge方法
- 9.19.3 反射和Properties(重要)
- TypeScript学习笔记之类
- 面试题之(js实现当年剩余时间倒计时程序)
- 启动Weblogic问题集锦
- Delphi处理数据网格DBGrid的编辑框 获取还没有提交到数据集的字段文本
- Gym 102091L Largest Allowed Area 【二分+二维前缀和】
- poj 1679 判断MST是不是唯一的 (次小生成树)
- iOS web view 与 js 交互
- Git 重命名操作
- ios开发之--NSURL的用法
- spark Kryo serialization failed: Buffer overflow 错误
- Java线程池停止空闲线程是否有规则呢?
- python numpy logic_and
- python egg for centos 制作
- 第四周 实验一 Java开发环境的熟悉 报告
- JS设计模式——2.初识接口
- MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能