spoj 104 Highways

生成树计数,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 ;
}

最新文章

  1. Linux启用和配置Java
  2. 【传递智慧】C++基础班公开课第六期培训
  3. LeetCode: Unique Paths 解题报告
  4. PHP--正则表达式和样式匹配--小记
  5. 2014 UESTC 暑前集训队内赛(3) 部分解题报告
  6. RHEL 6.4中解决xx用户不在sudoers列表,此事将被报告的问题
  7. QQ互联 回调地址
  8. Android(java)学习笔记242:多媒体之设置全屏的方法
  9. LR实战之Discuz开源论坛——登录脚本检查点
  10. Ubuntu Code::Blocks IDE 13.12 汉化
  11. Visual Studio 换颜色
  12. 非名校毕业年薪20W程序员 心得分享
  13. 授权远程连接MySQL(Linux)
  14. 深入理解java虚拟机_前言
  15. PHP实现网络Socket及IO多路复用
  16. Linux学习之路——文件查找:find
  17. Eclipse开发环境debug模式调试断点从jar跳到源码
  18. win7下mysql免安装版使用
  19. PCL—低层次视觉—关键点检测(iss&amp;Trajkovic)
  20. LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)

热门文章

  1. eclipse调试(转)
  2. RxJava 1升级到RxJava 2过程中踩过的一些“坑”
  3. docker制作共享jdk的tomcat镜像
  4. HDU 1008 电梯( 水题)
  5. 【文件拷贝】使用Total Commander Portable拖动拷贝文件,支持队列
  6. HDU5124 lines
  7. StringBuffer是可变的还是不可变的?
  8. JavaScript:理解worker事件api
  9. CUDA高性能编程中文实战11章例子中多设备的例子编译提示问题
  10. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (一) 安装dotnet core