BZOJ 3534: [Sdoi2014]重建(Matrix Tree)
解题思路
比较容易看的出来矩阵树定理。然后就怒送一Wa,这个矩阵树定理是不能直接用的。题目要求的其实是这个玩意。
\]
而矩阵树能求的东西本质上其实是每棵生成树的积的和,说人话就是这个。
\]
这个形式跟上面那个很像,但还是有点不一样。我们考虑将上面那个式子化简。根据
\]
把这玩意往最上面那个式子里一带,神奇的事情发生了:
\]
前面这个玩意可以直接算出来。后头这个玩意直接上矩阵树,把邻接矩阵的边权改成\(\frac{p_e}{1-p_e}\)就行了。
通过这道题,让我们明白了原来矩阵树里的那个边权是可以自己规定的,算出来的结果为每个生成树的积之和。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = 55;
const double eps = 1e-8;
int n;
double ans=1.0,base=1.0,f[MAXN][MAXN];
inline void Matrix_tree(){
	double t;int p;
	for(int i=1;i<n;i++){
		p=i;
		for(int j=i+1;j<n;j++)
			if(fabs(f[p][i])<fabs(f[j][i])) p=j;
		if(p!=i) swap(f[i],f[p]);
		for(int j=i+1;j<n;j++){
			t=f[j][i]/f[i][i];
			for(int k=i;k<n;k++)
				f[j][k]-=t*f[i][k];
		}
		ans*=f[i][i];
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			scanf("%lf",&f[i][j]);if(i==j) continue;
			if(f[i][j]>1.0-eps) f[i][j]-=eps;
			if(i>j && f[i][j]>eps) base*=(1-f[i][j]);
			f[i][j]=f[i][j]/(1-f[i][j]);
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)if(i!=j)
			f[i][i]+=f[i][j],f[i][j]=-f[i][j];
	Matrix_tree();printf("%.10lf",ans*base);
	return 0;
}
												
											BZOJ 3534: [Sdoi2014]重建(Matrix Tree)的更多相关文章
- bzoj 3534: [Sdoi2014]重建【矩阵树定理】
		
啊啊啊无脑背过果然不可取 比如这道题就不会写 参考:https://blog.csdn.net/iamzky/article/details/41317333 #include<iostream ...
 - [bzoj 3534][Sdoi2014] 重建
		
传送门 Description T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传 ...
 - 【BZOJ 3534】 3534: [Sdoi2014]重建 (Matrix-Tree Theorem)
		
3534: [Sdoi2014]重建 Time Limit: 10 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 709 Solved: 32 ...
 - @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
		
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
 - BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
		
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
 - bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...
 - 一篇自己都看不懂的Matrix tree总结
		
Matrix tree定理用于连通图生成树计数,由于博主太菜看不懂定理证明,所以本篇博客不提供\(Matrix\ tree\)定理的证明内容(反正这个东西背结论就可以了是吧) 理解\(Matrix\ ...
 - SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
		
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
 - P3317 [SDOI2014]重建(Matrix-tree+期望)
		
P3317 [SDOI2014]重建 详情看这位神犇的blog 剩下的注释在code里吧....... #include<iostream> #include<cstdio> ...
 
随机推荐
- java静态代理及动态代理(学习示例)
			
1.接口 public interface Channel { void send(); } 2.实现类(可以为各种不同实现) public class ChannelImpl implements ...
 - 管理mysql
			
要管理MySQL,可以使用可视化图形界面MySQL Workbench. MySQL Workbench可以用可视化的方式查询.创建和修改数据库表,但是,归根到底,MySQL Workbench是一个 ...
 - JVM内存分为哪几部分?各个部分的作用是什么?
			
JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器. 堆. 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xm ...
 - [Catalan数三连]网格&有趣的数列&树屋阶梯
			
如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...
 - ATM+购物车结构
			
ATM+购物车 1.需求分析 2.程序设计及目录设计 3.编写程序 4.调试程序
 - centOs7 java启动jar 并部署到nginx
			
简单启动命令 启动命令: nohup java –jar 项目名 & 注意1.加&表示一直后台运行,不加表示临时运行,关闭窗口项目即停止运行2.nohup:即项目在运行前新建一个noh ...
 - leetcode.字符串.696计数二进制子串-java
			
1. 具体题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的.重复出现的子串要计算它们出现的次数. 示例 1 : 输入: ...
 - 关于Web中的图标使用问题
			
挺懒的,这里做个记录. Web中的图标使用问题 : https://github.com/amfe/article/issues/2
 - 10-MySQL-Ubuntu-数据表中数据的查询(三)
			
数据的查询(select) (1)查询整个表的数据: select * from 表名; (2)查询给定条件的数据: select * from 表名 where 条件; (3)查询表中某些字段: ...
 - hdu 3123  2009 Asia Wuhan Regional Contest Online
			
以为有啥牛逼定理,没推出来,随便写写就A了----题非常水,可是wa了一次 n>=m 则n!==0 注意的一点,最后 看我的凝视 #include <cstdio> #includ ...