博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3317 [SDOI2014]重建(矩阵树定理+数学推导) [bzoj3534]
阅读量:5880 次
发布时间:2019-06-19

本文共 1200 字,大约阅读时间需要 4 分钟。

首先,大家应该都能看出来这是矩阵树定理,然后大部分人应该就会把概率直接带进去算,然后就愉快地WA掉了(我当时就是这么想的,幸亏没交)
然后就来讲这个题的正解思路。
首先我们来看答案应该是怎样的:

ans=Tree(u,v)EP(u,v)(u,v)E(1P(u,v))
然后我们来想一下怎么来构造这个答案:首先,我们直接矩阵树用高斯算出来的结果应该是这个:
now=Tree(u,v)EP(u,v)
那我们怎么让它变成答案那个样子呢?直观地,我们可以这样:
now=now(u,v)(1P(u,v))
然后就变成了这样子:
now=Tree(u,v)EP(u,v)(1P(u,v))(u,v)E(1P(u,v))
现在我们发现now与答案有着中间那一部分的差距,那么如何消除那个差距呢?
我们可以注意到式子中的第一个
P(u,v)其实就是矩阵的初值,那么也就是这个:
now=Tree(u,v)EAu,v(1P(u,v))(u,v)E(1P(u,v))
那么我们现在就是要让:
Au,v(1P(u,v))P(u,v)
想必我说到现在大家应该就懂了吧,我们只要这样:
Au,v=P(u,v)(1P(u,v))
这样我们现在的now值就是答案了!
tmp=(u,v)(1P(u,v))
now=tmpTree(u,v)EP(u,v)(1P(u,v))
还有就是几个技巧:
当矩阵中出现
|a|<eps时就
a=eps
当矩阵中出现
|1a|<eps时就
a=1eps
自己想一想为什么。
代码如下:

/**************************************************************    Problem: 3534    User: stone41123    Language: C++    Result: Accepted    Time:16 ms    Memory:1308 kb****************************************************************/#include
#define ll long longusing namespace std;int n;double a[51][51];double ans;double eps=1e-8;void gauss(){ for(int i=1;i
fabs(a[mx][i]))mx=j; } if(mx!=i)for(int j=1;j

转载于:https://www.cnblogs.com/stone41123/p/7581236.html

你可能感兴趣的文章
截取字符串中两个字符串中的字符串
查看>>
spring xml properties split with comma for list
查看>>
判断点是否在三角形内
查看>>
Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)...
查看>>
在odl中怎样实现rpc
查看>>
leetcode 110 Balanced Binary Tree
查看>>
python活用isdigit方法显示系统进程
查看>>
项目开发总结
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>