【HDU】4035 Maze
http://acm.hdu.edu.cn/showproblem.php?pid=4035
题意:给一棵n个节点的树,每个节点有值k[i]和e[i],分别表示k[i]概率走向1号节点,e[i]概率获得胜利(即停止),如果没有进行上边任意操作,则等概率的走向与这个节点连边的点。问走过的边的期望。(n<=10000)
#include <cstdio>
#include <cstring>
using namespace std;
const int N=10005;
const double eps=1e-10;
struct dat { double a, b, c, K, E; }D[N];
struct E { int next, to; }e[N<<1];
int n, cnt, ihead[N];
void clr() {
memset(ihead, 0, sizeof(int)*(n+1));
cnt=0;
}
void add(int u, int v) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v;
e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u;
}
double abs(double x) { return x<0?-x:x; }
void dfs(int x, int fa) {
bool flag=1;
double temp=1-D[x].K-D[x].E, suma=0, sumb=0, sumc=0;
int m=0;
for(int i=ihead[x]; i; ++m, i=e[i].next) if(e[i].to!=fa) {
flag=0;
dfs(e[i].to, x);
suma+=D[e[i].to].a;
sumb+=D[e[i].to].b;
sumc+=D[e[i].to].c;
}
if(flag) { D[x].a=D[x].K; D[x].b=D[x].c=temp; return; }
double di=m-temp*sumb;
D[x].a=(D[x].K*m+temp*suma)/di;
D[x].b=temp/di;
D[x].c=temp*(sumc+m)/di;
}
void work() {
dfs(1, -1);
if(abs(1-D[1].a)<=eps) puts("impossible");
else printf("%.6f\n", D[1].c/(1-D[1].a));
}
int main() {
int T; scanf("%d", &T);
for(int TT=1; TT<=T; ++TT) {
scanf("%d", &n);
for(int i=0; i<n-1; ++i) { int x, y; scanf("%d%d", &x, &y); add(x, y); }
for(int i=1; i<=n; ++i) scanf("%lf%lf", &D[i].K, &D[i].E), D[i].K/=100, D[i].E/=100;
printf("Case %d: ", TT);
work();
clr();
}
return 0;
}
好神的题...做出这题感觉对期望的认识大大加深了呢...
设状态$E[i]$表示当前在$i$节点还需要走$E[i]$的期望边即可结束,答案就是$E[1]$,容易得到:
对于叶子节点:
$$
\begin{align}
E[i] & = k[i]E[1]+e[i]*0+(1-k[i]-e[i])*(E[父亲]+1) \\
& = k[i]E[1]+(1-k[i]-e[i])E[父亲]+(1-k[i]-e[i])
\end{align}
$$
对于非叶子节点:
$$
\begin{align}
E[i] & = k[i]E[1]+e[i]*0+\frac{(1-k[i]-e[i])(E[父亲]+1+\sum_{j是i孩子} (E[j]+1)}{m} \\
& = k[i]E[1]+\frac{1-k[i]-e[i]}{m}E[父亲] + \frac{1-k[i]-e[i]}{m} \sum_{j是i孩子} E[j] + (1-k[i]-e[i])
\end{align}
$$
由于是树,我们要深度挖掘他们的性质:
1、我们发现非叶节点里只是多了$\sum_{j是i孩子} E[j]$
2、由于期望本来就是求极限意义,如果裸的这样求显然是递归无限的,我们需要通过数学技巧约掉式子
比如我们可以为了方便,设$E[i]$的一般式子为$E[i]=A[i]E[1]+B[i]E[父亲]+C[i]$(为什么带个父亲未知数呢?那是因为$i$的儿子需要知道自己父亲(即$i$)的期望,那么我们可以通过带入到原式中且移项即可解出$E[i]$,是不是很神奇呢0.0)
那么$\sum_{j是i孩子} E[j] = \sum_{j是i孩子} \left( A[j]E[1] + B[j]E[i] + C[j] \right)$
最终化简超强式子,变为求出这个一般方程的系数!:
对于叶子节点:
$$A[i]=k[i], B[i]=C[i]=1-k[i]-e[i]$$
对于非叶子节点:
设$di=m-(1-k[i]-e[i])\sum_{j} B[j], m=所有与i连边的节点数$
$$
\begin{align}
A[i] & = (k[i]m+(1-k[i]-e[i])\sum_{j} A[j]) / di \\
B[i] & = (1-k[i]-e[i]) / di \\
C[i] & = (1-k[i]-e[i])(m+\sum_{j} C[j]) / di
\end{align}
$$
最后答案:
$E[1]=C[i]/(1-A[1])$,判一下除数是否为0即可判断有无解。
【HDU】4035 Maze的更多相关文章
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 【HDU】2191 多重背包问题
原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...
- 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交
[题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
- 【HDU】5269 ZYB loves Xor I
[算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...
- 【HDU】3068 最长回文
[算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...
- 【HDU】2222 Keywords Search
[算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...
- 【HDU】6012 Lotus and Horticulture (BC#91 T2)
[算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...
- 【HDU】6146 Pokémon GO
[题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...
随机推荐
- 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- python解析RSS(feedparser)
虽然说当今的博客已经不像前几年那么火了,但是RSS还是一项很有创造性和实用性的东西.RSS 是用于分发 Web 站点上的内容的摘要的一种简单的 XML 格式.它能够用于共享各种各样的信息.关于RSS的 ...
- MongoDB学习(2)—Node.js与MongoDB的基本连接示例
前提 已经安装了node.js和MongoDB,本文使用的node.js是v0.12.0,MongoDB是3.0.0. 初始化数据 启动MongoDB服务,在test数据库中插入一条实例数据: db. ...
- Linux(centos)如何安装Zend Optimizer Zend Guard Loader
很多php开源系统都是基于Zend Optimizer的,所以我们需要先安装Zend Optimizer.但在php5.3之后Zend Optimizer被Zend Guard Loader 取代了, ...
- AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...
- Markdown语言.md文件
转自:http://www.kuqin.com/shuoit/20141125/343459.html 之前一直在使用github,也在上面分享了不少的项目和Demo,每次创建新项目的时候,使用的都是 ...
- Linux使用du和df查看磁盘和文件夹占用空间
df df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. df -lh 参数 -h 表示使用「Human-readable」输出,也就是使用 GB.MB 等易读的格式. $ ...
- 使用J2SE API读取Properties文件的六种方法
1.使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedInputStream(new FileInputStream( ...
- AngularJS 学习之事件
1.ng-click指令:定义了AngularJS点击事件 <div ng-app="" ng-controller="myCtrl"> <b ...
- DSP using MATLAB 示例 Example3.10
用到的性质 上代码: n = -5:10; x = rand(1,length(n)) + j * rand(1,length(n)); k = -100:100; w = (pi/100)*k; % ...