[bzoj 3534][Sdoi2014] 重建
传送门
Description
T国有N个城市,用若干双向道路连接。一对城市之间至多存在一条道路。
在一次洪水之后,一些道路受损无法通行。虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回。
幸运的是,此前T国政府调查过每条道路的强度,现在他们希望只利用这些信息估计灾情。具体地,给定每条道路在洪水后仍能通行的概率,请计算仍能通行的道路恰有N-1条,且能联通所有城市的概率。
Solution
给出每条边出现的概率,求生成一棵树的概率。
首先要知道矩阵树定理和变元矩阵树定理。。。
对于一个无向图G,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝对值
基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接矩阵 A
这里邻接矩阵可以有不同形式
- 如果\(A[i][j]\)表示i\(i\)和\(j\)之间边的数量,则\(det\)等于生成树的数量
- 如果\(A[i][j]\)表示\(i\)和\(j\)之间边的长度,则\(det=\sum_{T} \prod T_{e_i}\),也就是每个生成树的边权积之和
怎么求行列式?
这里有几个性质:
- 交换两行(列),行列式变号
- 加上另外一行的\(k\)倍,行列式不变
所以用高斯消元,把它变成一个上三角矩阵,那么它的行列式就是对角线的乘积啦
Code
#include <bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) (x>0?x:-x)
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
}
#define eps (1e-8)
int n;
double ans=1.,a[55][55];
double Gauss()
{
double ret=1.;
register int i,j,k;
for(i=1;i<n;++i)
{
//for(j=i+1;j<n;++j)
// if(abs(a[j][i])>abs(a[i][i])) std::swap(a[j],a[i]),ret=-ret;
for(j=i+1;j<n;++j)
{
double t=a[j][i]/a[i][i];
for(k=i;k<n;++k) a[j][k]-=t*a[i][k];
}
ret*=a[i][i];
}
return abs(ret);
}
int main()
{
scanf("%d",&n);
register int i,j;
for(i=1;i<=n;++i)for(j=1;j<=n;++j)
{
scanf("%lf",&a[i][j]);
double t=fabs(1.-a[i][j])<eps?eps:(1.-a[i][j]);
if(i<j) ans*=t;
a[i][j]=a[i][j]/t;
}
for(i=1;i<=n;++i)for(j=1;j<=n;++j)
if(i!=j) a[i][i]+=a[i][j],a[i][j]=-a[i][j];
printf("%.10lf\n",Gauss()*ans);
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
[bzoj 3534][Sdoi2014] 重建的更多相关文章
- bzoj 3534: [Sdoi2014]重建【矩阵树定理】
啊啊啊无脑背过果然不可取 比如这道题就不会写 参考:https://blog.csdn.net/iamzky/article/details/41317333 #include<iostream ...
- BZOJ 3534: [Sdoi2014]重建(Matrix Tree)
传送门 解题思路 比较容易看的出来矩阵树定理.然后就怒送一Wa,这个矩阵树定理是不能直接用的.题目要求的其实是这个玩意. \[ ans=\sum\limits_{Tree}( \prod\limits ...
- 【BZOJ 3534】 3534: [Sdoi2014]重建 (Matrix-Tree Theorem)
3534: [Sdoi2014]重建 Time Limit: 10 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 709 Solved: 32 ...
- P3317 [SDOI2014]重建(Matrix-tree+期望)
P3317 [SDOI2014]重建 详情看这位神犇的blog 剩下的注释在code里吧....... #include<iostream> #include<cstdio> ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- 【BZOJ 3534】: [Sdoi2014]重建
题目大意:(略) 题解: 相对误差……我好方. 考虑答案应该为所有合法答案概率之和.对于一个合法的生成树,其出现概率应为所有选取边的概率出现的积 乘以 所有未选取边不出现概率的积. 即: $\;\pr ...
- BZOJ 3534 重建
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3534 题意:给定一个无向图,每条边有选择概率P:求选出的边恰是一棵生成树的概率. 思路: ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
随机推荐
- python多线程爬取斗图啦数据
python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...
- 总结一下几个for循环常见用法和区别
1.for循环//有人喜欢使用一个临时变量把长度缓存起来,说是数据量大时效果更好(我本人没有去验证) for(j = 0,len=arr.length; j < len; j++) { //执行 ...
- 《你不知道的Javascript》感悟篇—对象属性遍历的那些事
划重点 本篇笔者将重点介绍JavaScript中 getOwnPropertyNames .Object.keys.for ... in 的使用及他们之间的异同点. getOwnPropertyNam ...
- 模板、中间件以及MVC与MTV
模板 基本数据类型的渲染 {#基础数据类型的渲染#} {#1. 变量#} {{ name }} {#2. 列表#} {#通过点索引可以取值#} {{ list.0 }} {#for循环取值#} {% ...
- jmeter第一次使用
创建线程组 依次创建后,在http请求页面填入接口地址,参数,头信息,点击运行,然后查看结果树
- c# 方法成员
- 温控PID自测验程序
#pragma once #ifndef _PID_H_ #define _PID_H_ #include <vector> #include <map> using name ...
- java 从上至下打印二叉树
从上往下打印二叉树题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, ...
- Castle Windsor Ioc 一个接口多个实现解决方案
介绍 Castle Windsor 是微软的Ioc类库,本文主要介绍解决一个接口多个实现的解决方案 接口和类 以下内容不是真实的实际场景,仅仅是提供解决一个接口多个实现的思路. 业务场景类 先假设有一 ...
- export default 和 export 的使用方式
node中导入模块:var 名称 = require('模块标识符') node中向外暴露成员的形式:module.exports = {} 在ES6中,也通过规范的形式,规定了ES6中如何导入和导出 ...