[BZOJ2878][NOI2012]迷失游乐园(环套树DP+概率)
推荐讲解:https://www.cnblogs.com/Tunix/p/4561493.html
首先考虑树的情况,就是经典的树上概率DP。先DP出down表示从这个点向儿子走能走的期望长度,再DP出up表示向父亲走的期望长度,注意算up的时候要注意消除原先此点对父亲的down的影响。
再考虑环的情况,由于环上点不超过20个,所以怎么暴力DP都好,算出up后down用同样的方法DP即可。
概率递推式比较多,主要考虑好各种点的情况(树根,非树根,环上点,环外点,叶子)。
再注意下式子里如果某项分母为0则忽略这项。
剩下的就是心态稳健地调试了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
typedef long long ll;
using namespace std; const int N=;
bool d[N];
int n,m,cnt,tim,tot,u,v,w,a[N],b[N],fa[N],pre[N],cf[N],dfn[N];
int son[N],h[N],nxt[N<<],to[N<<],val[N<<];
double ans,dn[N],up[N];
void add(int u,int v,int w){ to[++cnt]=v; val[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt; }
int F(int x){ return x-+((x==)?tot:); } void Dn(int x,int fa){
dn[x]=;
For(i,x) if ((k=to[i])!=fa && !d[k])
son[x]++,Dn(k,x),dn[x]+=dn[k]+val[i];
if (son[x]) dn[x]/=son[x];
} void Up(int x,int c){
up[x]=c;
if (son[fa[x]]-+cf[fa[x]]) up[x]+=(son[fa[x]]*dn[fa[x]]-dn[x]-c+up[fa[x]]*cf[fa[x]])/(son[fa[x]]-+cf[fa[x]]);
For(i,x) if ((k=to[i])!=fa[x]) fa[k]=x,Up(k,val[i]);
} void dfs(int x){
dfn[x]=++tim;
For(i,x) if ((k=to[i])!=fa[x]){
if (!dfn[k]) fa[k]=x,pre[k]=val[i],dfs(k);
else if (dfn[k]>dfn[x]){
for (int t=k; t!=x; t=fa[t]) a[++tot]=t,d[t]=,cf[t]=,b[tot]=pre[t];
a[++tot]=x; d[x]=; cf[x]=; b[tot]=val[i];
}
}
} int main(){
freopen("bzoj2878.in","r",stdin);
freopen("bzoj2878.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,m) scanf("%d%d%d",&u,&v,&w),add(u,v,w),add(v,u,w);
rep(i,,n) cf[i]=;
if (m==n-){
Dn(,); cf[]=;
For(i,) fa[k=to[i]]=,Up(k,val[i]);
}else{
dfs();
rep(i,,tot) Dn(a[i],);
rep(i,,tot){
int x=a[i]; double k=0.5;
for (int j=i%tot+; j!=i; j=j%tot+){
if (j%tot+!=i) up[x]+=k*(b[F(j)]+dn[a[j]]*son[a[j]]/(son[a[j]]+));
else up[x]+=k*(b[F(j)]+dn[a[j]]);
k/=son[a[j]]+;
}
k=0.5;
for (int j=F(i); j!=i; j=F(j)){
if (F(j)!=i) up[x]+=k*(b[j]+dn[a[j]]*son[a[j]]/(son[a[j]]+));
else up[x]+=k*(b[j]+dn[a[j]]);
k/=son[a[j]]+;
}
}
rep(j,,tot){
int x=a[j];
For(i,x) if (!d[k=to[i]]) fa[k]=x,Up(k,val[i]);
}
}
rep(i,,n) ans+=(up[i]*cf[i]+dn[i]*son[i])/(cf[i]+son[i]);
printf("%.5lf\n",ans/n);
return ;
}
[BZOJ2878][NOI2012]迷失游乐园(环套树DP+概率)的更多相关文章
- [bzoj2878][Noi2012]迷失游乐园(基环树dp)
[bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...
- BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)
考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...
- BZOJ2878 [Noi2012]迷失游乐园 【基环树 + 树形dp + 期望dp】
题目链接 BZOJ2878 题解 除了实现起来比较长,思维难度还是挺小的 观察数据范围发现环长不超过\(20\),而我们去掉环上任何一个点就可以形成森林 于是乎我们枚举断掉的点,然后只需求出剩余每个点 ...
- bzoj2878 [Noi2012]迷失游乐园——概率期望DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 这个博客写得很好:https://www.cnblogs.com/qt666/p/72 ...
- bzoj2878 [Noi2012]迷失游乐园 [树形dp]
Description 放假了,小Z认为呆在家里特别无聊.于是决定一个人去游乐园玩. 进入游乐园后.小Z看了看游乐园的地图,发现能够将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环 ...
- [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)
传送门 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m ...
- BZOJ2878 [Noi2012]迷失游乐园
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【BZOJ 2878】 2878: [Noi2012]迷失游乐园 (环套树、树形概率DP)
2878: [Noi2012]迷失游乐园 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m ...
- BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...
随机推荐
- LintCode 190: Next Permutation
LintCode 190: Next Permutation 题目描述 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 ...
- Selenium/HtmlUnit设置代理获取JS生成的网页
通常我们使用Java提供的HttpURLConnection或者Apache的HttpClient获取的网页源代码都是直观可见的,其代码的内容和通过浏览器右键网页->点击查看网页源代码的内容一致 ...
- vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist
本文地址:http://www.cnblogs.com/veinyin/p/7910525.html 我的路由配置 { path: '/page', name: page, component: pa ...
- HDU 2159 FATE (dp)
题目链接 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最 ...
- Sublime之插件的安装(三)
今天在写js的时候,突然想到一个问题就是能不能快速的对齐的插件,当当当~~~sublime这么神器当然有,那就是:Alignment插件 如果你写的代码是这样的: var a = , b =, ccc ...
- Python3 re模块正则表达式中的re.S
在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下代码: import re ...
- Android上HDMI介绍(基于高通平台)
本文重点针对HDMI在android上的应用,而比较相关的就是overlay机制.overlay在这里只是简单的介绍,后续会有文章再专门详述. 我没记错的话,高通从7X30开始,平台就可以支持HDMI ...
- 修改 firefox accesskey 的快捷键
Chrome中,如果设置了 accesskey 的话,可以通过 Alt + 快捷键 来之直接跳转的.但在Firefox 中,可能是为了防止于菜单的快捷键冲突,所以设置了 Shift + Alt + 快 ...
- 安装mysql驱动之 mysqlclient 出现的报错处理(ubuntu16.04)
首先 更新软件! sudo apt-get update 然后尝试安装mysqlclient,报错 后执行下面的步骤 安装mysql驱动之 mysqlclient 出现的报错信息处理 报错1: OSE ...
- Struts2使用
Struts2是一个基于MVC设计模式的Web应用框架.在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.Struts 2是Struts的下一代产品,是在 ...