题解

前置芝士:深度理解的矩阵树定理

矩阵树定理能求生成树个数的原因是,它本质上求的是:

\[\sum_T \prod_{e\in T} w_e
\]

其中 \(w_e\) 是边权,那么我们会发现其实当边权是 \(1\) 时,本式所求即为生成树个数。

那么回到这题来,这题让求的是

\[\sum_{T}\prod_{e\in T}w_e\prod_{e\notin T}(1-w_e)
\]

很容易看出来,这个式子和上面矩阵树的式子很像。让我们来推一波。

\[(\sum_T \prod_{e\in T} w_e) × \prod_{e}w_e=\sum_T\prod_{e\in T}w_e(1-w_e)\prod_{e\notin T}(1-w_e)
\]

此式和上面答案更近了一步,我们只需把 \(\prod_{e\in T}(1-w_e)\) 消掉即可。

显然

\[w_e=(1-w_e)×\frac{w_e}{1-w_e}
\]

所以,我们要求的就是 \(\sum_{T}\prod_{e\in T}\frac{w_e}{1-w_e}\) 

于是我们在初始化 \(Laplace\) 矩阵时直接以 \(\frac{w_e}{1-w_e}\) 为边权。

有一个需要注意的地方,因为 \(w_e\in [0,1]\),而 \(w_e\) 为分子,当 \(w_e=0\) 是,原式趋于无穷小,所以我们可以将其赋为 \(eps\) ,在分母上的 \(1-w_e\) 则反过来,若 \(w_e=1\) 则原式趋于无穷大,所以可以赋其为 \(1-eps\) 。

至于为什么这样,是为了防止式子在计算机中浮点数例外。

Code

\(AC\kern 0.5emCODE:\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri 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<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
typedef double db;
static const int N=55;
static const db eps=1e-8;
db G[N][N],ans=1.0,tmp=1.0;
int n;
inline void Gauss() {
int tr=0;
for (ri i(1);i<=n;p(i)) {
int k=i;
for (ri j(i+1);j<=n;p(j)) if (fabs(G[j][i])>fabs(G[k][i])) k=j;
if (k!=i) swap(G[i],G[k]),tr^=1;
// for (ri j(1);j<=n;p(j)) printf("%.8lf ",G[i][j]);
// puts("");
for (ri j(i+1);j<=n;p(j)) {
db tmp=G[j][i]/G[i][i];
for (ri l(i);l<=n;p(l)) G[j][l]-=tmp*G[i][l];
}
if (fabs(G[i][i])<eps) {ans=0;return;}
ans=ans*G[i][i];
// printf("ans=%.10lf G[i][i]=%.10lf\n",ans,G[i][i]);
}
if (tr) ans=-ans;
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read();
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=n;p(j)) scanf("%lf",&G[i][j]);
}
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=n;p(j)) {
if (G[i][j]<eps) G[i][j]=eps;
if ((1.0-G[i][j])<eps) G[i][j]=1.0-eps;
if (i<j) tmp*=(1.0-G[i][j]);
G[i][j]/=(1.0-G[i][j]);
}
}
// printf("tmp=%.10lf\n",tmp);
for (ri i(1);i<=n;p(i)) {
G[i][i]=0.0;
for (ri j(1);j<=n;p(j)) {
if (i!=j) G[i][i]+=G[i][j],G[i][j]=-G[i][j];
}
}
n-=1;
Gauss();
printf("%.10lf\n",ans*tmp);
return 0;
}
}
int main() {return nanfeng::main();}

题解 P3317 [SDOI2014]重建的更多相关文章

  1. P3317 [SDOI2014]重建(Matrix-tree+期望)

    P3317 [SDOI2014]重建 详情看这位神犇的blog 剩下的注释在code里吧....... #include<iostream> #include<cstdio> ...

  2. P3317 [SDOI2014]重建 变元矩阵树定理 高斯消元

    传送门:https://www.luogu.org/problemnew/show/P3317 这道题的推导公式还是比较好理解的,但是由于这个矩阵是小数的,要注意高斯消元方法的使用: #include ...

  3. 洛谷P3317 [SDOI2014]重建 [Matrix-Tree定理]

    传送门 思路 相信很多人像我一样想直接搞Matrix-Tree定理,而且还过了样例,然后交上去一分没有. 但不管怎样这还是对我们的思路有一定启发的. 用Matrix-Tree定理搞,求出的答案是 \[ ...

  4. P3317 [SDOI2014]重建

    思路 变元矩阵树定理可以统计最小生成树边权积的和,将A矩阵变为边权,D变为与该点相连的边权和,K=D-A,求K的行列式即可 把式子化成 \[ \begin{align}&\sum_{T}\pr ...

  5. 【BZOJ 3534】 3534: [Sdoi2014]重建 (Matrix-Tree Theorem)

    3534: [Sdoi2014]重建 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 709  Solved: 32 ...

  6. BZOJ3534:[SDOI2014]重建——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3534 https://www.luogu.org/problemnew/show/P3317 T国 ...

  7. 【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元

    题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节. 邻接矩阵是可以带权值的.求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵.而所谓变元矩阵树实际上就是 ...

  8. 【BZOJ 3534】: [Sdoi2014]重建

    题目大意:(略) 题解: 相对误差……我好方. 考虑答案应该为所有合法答案概率之和.对于一个合法的生成树,其出现概率应为所有选取边的概率出现的积 乘以 所有未选取边不出现概率的积. 即: $\;\pr ...

  9. BZOJ3534 [Sdoi2014]重建 【矩阵树定理】

    题目 T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传回. 辛运的是,此前T国政府 ...

随机推荐

  1. C# 8.0和.NET Core 3.0高级编程 分享笔记一:C#8.0与NET Core 3.0入门

    在学习C#相关知识的过程中,我们使用Visual Studio Code来入门整个C#. 一.安装Visual Studio Core环境 通过https://code.visualstudio.co ...

  2. Anaconda软件安装使用问题

    目录 更新源 用conda安装包出现的环境不一致问题 更新源 命令行 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...

  3. Linux_NTP

    服务器端配置 允许这些IP向自己同步时间 restrict x.x.x.x mask x.x.x.x nomodiy notrap 当前定义的所有server服务器无法同步后,和自身同步 server ...

  4. CF277E Binary Tree on Plane

    CF277E Binary Tree on Plane 题目大意 给定平面上的 \(n\) 个点,定义两个点之间的距离为两点欧几里得距离,求最小二叉生成树. 题解 妙啊. 难点在于二叉的限制. 注意到 ...

  5. 写了这么多年 CSS,initial 和 inherit 以及 unset 和 revert 还傻傻分不清楚?

    经常会碰到,问一个 CSS 属性,例如 position 有多少取值. 通常的回答是 static.relative.absolute 和 fixed .当然,还有一个稍微生僻的 sticky .其实 ...

  6. Spring框架中一个有用的小组件:Spring Retry

    1.概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力.这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助. 在本文中,我们将看到使用Spri ...

  7. 整理最近用的Mongo查询语句

    背景 最近做了几个规则逻辑.用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断. 方法 MongoDB聚合使 ...

  8. facade层,service 层,domain层,dao 层设计

    转自http://fei-6666.iteye.com/blog/446247,记录下来 一,Service->DAO,只能在Service中注入DAO. 二,DAO只能操作但表数据,跨表操作放 ...

  9. centos7 源码安装指定版本的php7

    很多时候可能会遇到需要手动源码安装软件的时候,所以自己实践了一把,并且把安装过程中遇到的问题,以及在网上找到的解决办法(实测有效)都记录下来,方便日后学习实践. 1. 系统环境 # cat /etc/ ...

  10. CentOS下配置Nginx实现动静分离实例

    测试环境: CentOS Linux release 7.6 PHP 7.2.32 两台服务器:192.168.1.109(Nginx),192.168.1.118(Apache) 1. 安装配置19 ...