参考:https://blog.csdn.net/shiyukun1998/article/details/44684947

先看对于树的情况

设d[u]为点u向儿子走的期望长度和,du[u]为u点的度数,f[u]为u向儿子走的期望长度,只需要dfs两遍,一次求向儿子的d[u]+=f[e[i].to]+e[i].va;,第二次求向父亲走的情况d[e[i].to]+=(d[u]-e[i].va-f[e[i].to])/max(1,du[u]-1)+e[i].va;(u表示向父亲走之后能再向父亲的非u儿子走)

至于环上的情况,向儿子和树一样,问题在于环点向父亲的情况,因为这可能沿着环走下去,所以先求完向儿子的,然后d加上沿着环走下去的期望

然后对于每个环点像处理树一样践行第二次dfs即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100005;
int n,m,h[N],cnt,du[N],root,v[N],ti,fa[N];
double d[N],f[N],g[N],gg[N],ans;
bool ci[N];
struct qwe
{
int ne,to;
double va;
}e[N<<1];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void dfs1(int u,int fa)
{
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa&&!ci[e[i].to])
{
du[u]++;
dfs1(e[i].to,u);
d[u]+=f[e[i].to]+e[i].va;
}
if(du[u])
f[u]=d[u]/(double)du[u];
if(u!=root)
du[u]++;
}
void dfs2(int u,int fa)
{
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa&&!ci[e[i].to])
{
d[e[i].to]+=(d[u]-e[i].va-f[e[i].to])/max(1,du[u]-1)+e[i].va;
dfs2(e[i].to,u);
}
}
void zhao(int u)
{
v[u]=++ti;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa[u])
{
if(!v[e[i].to])
fa[e[i].to]=u,zhao(e[i].to);
else if(v[e[i].to]<v[u])
{
for(int j=u;j!=e[i].to;j=fa[j])
ci[j]=1;
ci[e[i].to]=1;
}
}
}
void wk(int u,int fa)
{
bool fl=0;
g[u]=0;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=root&&e[i].to!=fa&&ci[e[i].to])
{
fl=1;
wk(e[i].to,u);
g[u]+=g[e[i].to]+e[i].va;
}
if(u==root)
return;
double k=du[u]+(du[u]==0);
if(!fl)
g[u]=d[u]/k;
else
k=du[u]+1,g[u]=(g[u]+d[u])/k;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
if(m==n-1)
{
root=1;
dfs1(1,0);
dfs2(1,0);
}
else
{
zhao(1);
for(int i=1;i<=n;i++)
if(ci[i])
root=i,dfs1(i,0);
for(int i=1;i<=n;i++)
if(ci[i])
root=i,wk(i,0),gg[i]=g[i];
for(int i=1;i<=n;i++)
if(ci[i])
du[i]+=2,d[i]+=gg[i];
for(int i=1;i<=n;i++)
if(ci[i])
root=i,dfs2(i,0);
}
for(int i=1;i<=n;i++)
ans+=d[i]/(double)du[i];
printf("%.5lf\n",ans/(double)n);
return 0;
}

bzoj 2878: [Noi2012]迷失游乐园【树上期望dp+基环树】的更多相关文章

  1. [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)

    传送门 题目描述 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩. 进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m ...

  2. bzoj 2878 [Noi2012]迷失游乐园——树上的期望dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 很好的树上概率题的思路,就是分成up和down. 代码中有众多小细节.让我弃疗好几天的 ...

  3. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  4. bzoj 2878: [Noi2012]迷失游乐园

    #include<iostream> #include<cstring> #include<cstdio> #define M 100005 #define ld ...

  5. BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)

    考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...

  6. bzoj2878 [Noi2012]迷失游乐园——概率期望DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2878 这个博客写得很好:https://www.cnblogs.com/qt666/p/72 ...

  7. 【BZOJ 2878】 2878: [Noi2012]迷失游乐园 (环套树、树形概率DP)

    2878: [Noi2012]迷失游乐园 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m ...

  8. Luogu P2081 [NOI2012]迷失游乐园 | 期望 DP 基环树

    题目链接 基环树套路题.(然而各种错误调了好久233) 当$m=n-1$时,原图是一棵树. 先以任意点为根做$dp$,求出从每一个点出发,然后只往自己子树里走时路径的期望长度. 接着再把整棵树再扫一遍 ...

  9. 2878: [Noi2012]迷失游乐园 - BZOJ

    Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环( ...

随机推荐

  1. 原生JS版和jQuery 版实现文件上传功能

    <!doctype html> <html lang="zh"> <head> <meta charset="utf-8&quo ...

  2. EGit应用

    [创建Dynamic Web Project项目] [创建仓库] 项目(鼠标右键) ==〉Team==〉Share Project..... ==〉选择Git 配置Repository的目录 创建完成 ...

  3. ORACLE RAC with NFS install

    第一步:建立第一台节点机1).拷贝一台虚拟机做第一个节点,增加host-only的网卡 kudzu工具识别网卡(两都host-only是可以的).然后以下步骤修改相应的配置.etc/hosts内容如下 ...

  4. 如何写Java文档注释(Java Doc Comments)

    本文翻译自How to Write Doc Comments for the Javadoc Tool,但是精简了一些私以为不重要的东西 本文不讨论如何使用javadoc工具自动生成文档的方法,而是主 ...

  5. android开发里跳过的坑-android studio 错误 Could not find junit:junit:4.12

    在导入一个新项目时,出现错误Could not find junit:junit:4.12,网上大多是说缺少junit的jar包,但我查看了安装目录下是有jnuit包的,并且新建的项目都没有问题.几经 ...

  6. 听dalao讲课 7.27

    1.高斯消元&线性基 也就是打大暴力啊 所谓的高斯消元也就是加减消元嘛,我的意识流高斯消元是可以的,没听到HY神犇讲,LZHdalao讲得很好,其实就是\(O(n^3)\)的暴力,别的地方一直 ...

  7. [bzoj5343][Ctsc2018]混合果汁_二分答案_主席树

    混合果汁 bzoj-5343 Ctsc-2018 题目大意:给定$n$中果汁,第$i$种果汁的美味度为$d_i$,每升价格为$p_i$,每次最多添加$l_i$升.现在要求用这$n$中果汁调配出$m$杯 ...

  8. Java度线程——生产消费问题

    /*JDK1.4版本:生产者,消费者.多生产者,多消费者的问题.if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况.while判断标记,解决了线程获取执行权后,是否要运行! no ...

  9. 【nginx】nginx与apache的优缺点比较

    参考: http://zyan.cc/nginx_php_v6/ nginx相对于apache的优点: 1.轻量级,同样的web 服务,比apache服务器占用更少的内存及资源 2.抗并发,nginx ...

  10. 《Java设计模式》之接口模式

    -----------模式是思想的体现,而非详细的实现. 抽象的讲,类的接口是类同意其它类对象訪问的方法与字段集.接口通常代表一种承诺,即方法须要实现接口方法名表示的操作,遵循代码凝视和其它文档说明. ...