spoj 104 Highways(Matrix-tree定理)
2024-08-25 21:44:12
生成树计数,matrix-tree定理的应用。
Matrix-tree定理:
D为无向图G的度数矩阵(D[i][i]是i的度数,其他的为0),A为G的邻接矩阵(若u,v之间存在边,A[u][v]=A[v][u]=1),C=D-A。
对于一个无向图G,它的生成树个数等于其Kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值。 所谓n-1阶主子式,就是对于任意一个r,将C的第r行和第r列同表示时删去后的新矩阵,表示为Cr。
求行列式的值:
把矩阵用高斯消元消成上三角矩阵,对角线的积就是行列式的值。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath> using namespace std; const double eps = 1e-; double c[][];
int T,n,m; double Gauss() {
for (int k=; k<=n; ++k) {
int r = k;
for (int i=k+; i<=n; ++i)
if (fabs(c[i][k]) > fabs(c[r][k])) r = i;
if (r!=k) for (int j=; j<=n; ++j) swap(c[k][j],c[r][j]);
for (int i=k+; i<=n; ++i)
if (fabs(c[i][k]) > eps) {
double t = c[i][k] / c[k][k];
for (int j=k; j<=n; ++j) c[i][j] -= t*c[k][j];
}
}
double ans = 1.0;
for (int i=; i<=n; ++i) ans = ans*c[i][i]; //矩阵的对角线乘积
return (ans > ) ? ans : -ans;//取绝对值
} int main() {
scanf("%d",&T);
while (T--) {
memset(c,,sizeof(c));
scanf("%d%d",&n,&m);
for (int u,v,i=; i<=m; ++i) {
scanf("%d%d",&u,&v);
c[u][v] = c[v][u] = -;//边
c[u][u] ++;c[v][v] ++;//度数
}
n--; // 去掉最后一行最后一列
double ans = Gauss(); //高斯消元
printf("%.0lf\n",ans+eps);
}
return ;
}
最新文章
- Linux启用和配置Java
- 【传递智慧】C++基础班公开课第六期培训
- LeetCode: Unique Paths 解题报告
- PHP--正则表达式和样式匹配--小记
- 2014 UESTC 暑前集训队内赛(3) 部分解题报告
- RHEL 6.4中解决xx用户不在sudoers列表,此事将被报告的问题
- QQ互联 回调地址
- Android(java)学习笔记242:多媒体之设置全屏的方法
- LR实战之Discuz开源论坛——登录脚本检查点
- Ubuntu Code::Blocks IDE 13.12 汉化
- Visual Studio 换颜色
- 非名校毕业年薪20W程序员 心得分享
- 授权远程连接MySQL(Linux)
- 深入理解java虚拟机_前言
- PHP实现网络Socket及IO多路复用
- Linux学习之路——文件查找:find
- Eclipse开发环境debug模式调试断点从jar跳到源码
- win7下mysql免安装版使用
- PCL—低层次视觉—关键点检测(iss&;Trajkovic)
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
热门文章
- eclipse调试(转)
- RxJava 1升级到RxJava 2过程中踩过的一些“坑”
- docker制作共享jdk的tomcat镜像
- HDU 1008 电梯( 水题)
- 【文件拷贝】使用Total Commander Portable拖动拷贝文件,支持队列
- HDU5124 lines
- StringBuffer是可变的还是不可变的?
- JavaScript:理解worker事件api
- CUDA高性能编程中文实战11章例子中多设备的例子编译提示问题
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (一) 安装dotnet core