SHOI 2014 【概率充电器】
加油,两道了,也就还剩那么二十来道吧,慢慢做。。。。。。
题目大意:
给你一颗树,树上的每一个节点都有一定的概率p[i]能冲上电,有电的点,可以通过树上的边,一定概率地将电传递到与它相邻的点,同时对于每条边,都有一个传递电能的成功率。让你求出通电节点个数的期望。
读入:一个数n,接下来n-1行,每行三个数u,v,p,表示有一条连接节点u和v的边,导电的概率为p,最后一行共n个数,表示每个节点一开始就有电的概率。
- 输出:一个数E,表示期望(取6位小数)。
思路分析:
换根DP+期望DP
很清楚,最后的答案就是每一个点通电的概率相加。那么对于每一个点,我们可以求出它不通电的概率,然后再用1去减就可以了。(求不通电的概率比较简单)
有了大致的思路,我们就可以开始设计DP啦!
以1为根,我们开始做树形DP。
对于每一个点u,我们将其分两种情况讨论:
1、以u为根的子树无法使其通上电。
我们建立一个f数组,其中f[u]表示以u为根的子树,无法使u通上电的概率。
那么对于每一个u的儿子v,它不能使u通电又有两种情况:
a、它的儿子v不通电。
b、v通电,但是连接u,v的边不导电。
所以:f[u]=(1-p[u])∏v∈u's son(f[v]+(1-f[v])*(1-P[u,v])) 其中P表示u,v通电的概率
注意:因为a,b两种情况是互斥的两种情况所以f[v]和(1-f[v])*(1-P[u,v])应相加,而对于每一个v无论是哪一个v使u通电都一样,他们是独立的,所以是相乘。
2、u的父亲无法使u通上电。
这种情况,这,这,这——这TM玩个鸡儿啊!!!
万念俱灰,推出了一个看似完美的DP但最终仍是难逃被题目蹂躏的命运。
这第二种情况应该怎么处理呢?怎么处理呢?不会啊,怎么办呢?——不会那就不处理呗!!!
我们都知道,在一棵树中,有一个叫做根节点的神奇玩意儿——它是没有父亲的!
所以再不济,我们以每一个节点为根跑一遍上面的DP不就完事儿了吗!
但是我们真的需要这么做吗?——肯定不用啊!
一遍DP之后得到的大好信息,我们怎么能说扔就扔了呢?浪费可耻啊!
我们建立数组g,其中g[u]为以u为根节点,点u不被充电的概率,显然f[1]=g[1]。
那么我们考虑节点v(v为1号节点的一个儿子),再设一个x为以1为根节点的树,不算儿子v对于1号节点的影响,1号节点不被充电的概率。
那么:g[v]=f[v]*(x+(1-x)*(1-P[1,v]))
而x也很好求,因为对于1号节点的每一个儿子节点,他们对于一号节点的影响都是相对独立的,所以x=g[1]/(f[v]+(1-f[v])*(1-P[1,v]))。
所以整个g数组的转移就被我们推导出来啦!即:g[v]=f[v]*(x+(1-x)*(1-P[u,v])) 其中:x=g[u]/(f[v]+(1-f[v])*(1-P[u,v]))
代码:
- var
- next,head,vet:array[1..1000000]of longint;
- vis:array[1..500000]of boolean;
- p,f,dist,g:array[1..1000000]of double;
- tot,i,n,x,y:longint;
- ans,z:double;
- procedure add(x,y:longint;z:real);
- begin
- inc(tot);
- next[tot]:=head[x];
- vet[tot]:=y;
- head[x]:=tot;
- dist[tot]:=z;
- end;
- procedure dfs(u:longint);
- var
- i,v:longint;
- begin
- vis[u]:=true; i:=head[u];
- while i<>0 do
- begin
- v:=vet[i];
- if not vis[v] then
- begin
- dfs(v);
- f[u]:=f[u]*(f[v]+(1-f[v])*(1-dist[i]));
- end;
- i:=next[i];
- end;
- end;
- procedure change(u:longint);
- var
- i,v:longint;
- x:double;
- begin
- vis[u]:=true; i:=head[u];
- while i<>0 do
- begin
- v:=vet[i];
- if not vis[v] then
- begin
- x:=g[u]/(f[v]+(1-f[v])*(1-dist[i]));
- g[v]:=f[v]*(x+(1-x)*(1-dist[i]));
- change(v);
- end;
- i:=next[i];
- end;
- end;
- begin
- read(n);
- for i:=1 to n-1 do
- begin
- read(x,y,z);
- add(x,y,z/100); add(y,x,z/100);
- end;
- for i:=1 to n do
- begin
- read(p[i]);
- p[i]:=p[i]/100;
- f[i]:=1-p[i];
- end;
- dfs(1);
- g[1]:=f[1];
- fillchar(vis,sizeof(vis),false);
- change(1);
- for i:=1 to n do
- ans:=ans+1-g[i];
- writeln(ans:0:6);
- end.
SHOI 2014 【概率充电器】的更多相关文章
- [bzoj 3566][SHOI 2014]概率充电器
传送门 Description SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定. 随后电能可以 ...
- [ SHOI 2014 ] 概率充电器
\(\\\) \(Description\) 一个含\(N\)个元器件的树形结构充电器,第\(i\)个元器件有\(P_i\)的概率直接从外部被充电,连接\(i,j\)的边有\(P_{i,j}\)的概率 ...
- 解题:SHOI 2014 概率充电器
题面 显然就是在求概率,因为期望乘的全是1....然后就推推推啊 设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的 ...
- BZOJ 3566: [SHOI2014]概率充电器( 树形dp )
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...
- bzoj 3566: [SHOI2014]概率充电器
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器:"采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率 ...
- [SHOI2014]概率充电器
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- [SHOI2014]概率充电器(概率+换根dp)
著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品 ...
- BZOJ3566: [SHOI2014]概率充电器 树形+概率dp
3566: [SHOI2014]概率充电器 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1888 Solved: 857[Submit][Stat ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
随机推荐
- JSON<前后端的沟通>
1.什么是JSON ==>1什么是json json:是一种轻量级数据交互格式 数据交互:每一种语言的编码都不一样,他们之间互不认识.但是现在的情况是不同的语言开发出的系统也需要进行数据交互,这 ...
- hexo博客front-matter格式
通用格式 Front-matter 是文件最上方以 --- 分隔的区域,用于指定个别文件的变量,举例来说: --- title: Hello World date: 2013/7/13 20:46:2 ...
- linux下ftp如何使用
linux下ftp可以上传.下载文件 centos7环境: 1.检查是否安装过ftp服务 rpm -qa|grep vsftpd 如果没有输出则表示没有安装过 安装ftp yum -y install ...
- Spring Batch远程分区的本地Jar包模式
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud Spring Batch远程分区对于大量数据的处理非常擅长,它的实现 ...
- 深度理解volatile关键字
最轻量的同步机制 获取被volatile修饰的变量的时候,每次都要从主内存中获取 设置被volatile修饰的变量的时候,每次都要刷回主内存当中 当其他线程调用的时候,会将自己线程当中保存的变量值置为 ...
- CentOS7使用PackageCloud安装RabbitMQ
环境:CentOS Linux release 7.6.1810 (Core) RabbitMQ:3.7.17Erlang: 22.0.7 使用PackageCloud安装RabbitMQ是最简单的安 ...
- web网站——理论01
LAMP的架构以及通信过程 LAMP的架构: LAMP是一个多C/S架构的平台,最初级为web客户端基于TCP/IP通过http协议发起传送,这个请求可能是动态的,也可能是静态的. 所以web服务器通 ...
- axios+Qs请求数据转表单格式
import axios from 'axios' import qs from 'qs' axios.post('http://localhost:8888/baseitem/update', qs ...
- Java内部类使用场景和作用
一.Java内部类的分类 Java内部类一般包括四种:成员内部类.局部内部类.匿名内部类和静态内部类 大多数业务需求,不使用内部类都可以解决,那为什么Java还要设计内部类呢. 二.内部类的使用场景 ...
- Docker:二、开始部署第一个Asp.net应用
各位看官大家好,接着上一篇,我们构建自己的镜像文件成功之后,准备开始部署自己的第一个docker应用了... 接着上文,我们构建自己的镜像,如下是Dockerfile文件 #引入运行环 ...