#include<iostream>
#include<cstring>
#include<cstdio>
#define M 100005
#define ld long double
int head[M],next[*M],u[*M],l[*M],n,m,cnt,du[M],v[M],root,now,fa[M],c[M];
ld d[M],f[M],g[M],gg[M];
using namespace std;
void jia(int a1,int a2,int a3)
{
cnt++;
u[cnt]=a2;
l[cnt]=a3;
next[cnt]=head[a1];
head[a1]=cnt;
return;
}
void dfs1(int a1)
{
v[a1]=;
for(int i=head[a1];i;i=next[i])
if(!v[u[i]]&&!c[u[i]])
{
dfs1(u[i]);
du[a1]++;
d[a1]+=f[u[i]]+(ld)l[i];
}
if(du[a1])
f[a1]=d[a1]/(ld)du[a1];
if(a1!=root)
du[a1]++;
return;
}
void dfs2(int a1)
{
v[a1]=;
for(int i=head[a1];i;i=next[i])
if(!v[u[i]]&&!c[u[i]])
{
int k=du[a1]-;
if(!k)
k++;
d[u[i]]+=(d[a1]-f[u[i]]-(ld)l[i])/(ld)k+(ld)l[i];
dfs2(u[i]);
}
return;
}
void zhao(int a1)
{
v[a1]=++now;
for(int i=head[a1];i;i=next[i])
if(!v[u[i]])
{
fa[u[i]]=a1;
zhao(u[i]);
}
else if(u[i]!=fa[a1]&&v[a1]>v[u[i]])
{
c[u[i]]=;
for(;a1!=u[i];)
{
c[a1]=;
a1=fa[a1];
}
}
return;
}
void huan(int a1,int fa)
{
bool kg=;
g[a1]=0.00000;
for(int i=head[a1];i;i=next[i])
if(c[u[i]]&&u[i]!=fa&&u[i]!=root)
{
kg=;
huan(u[i],a1);
g[a1]+=g[u[i]]+(ld)l[i];
}
if(a1==root)
return;
int k=du[a1];
if(!k)
k++;
if(kg)
g[a1]=d[a1]/(ld)k;
else
{
k=du[a1]+;
g[a1]=(g[a1]+d[a1])/(ld)k;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int a1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
jia(a1,a2,a3);
jia(a2,a1,a3);
}
if(n==m+)
{
root=;
dfs1();
for(int i=;i<=n;i++)
v[i]=;
dfs2();
}
else
{
zhao();
for(int i=;i<=n;i++)
v[i]=;
for(int i=;i<=n;i++)
if(c[i])
{
root=i;
dfs1(i);
}
for(int i=;i<=n;i++)
if(c[i])
{
root=i;
huan(i,);
gg[i]=g[i];
}
for(int i=;i<=n;i++)
if(c[i])
{
du[i]+=;
d[i]+=gg[i];
}
for(int i=;i<=n;i++)
v[i]=;
for(int i=;i<=n;i++)
if(c[i])
dfs2(i);
}
double ans=0.00000;
for(int i=;i<=n;i++)
ans+=d[i]/(ld)du[i];
printf("%.5lf\n",ans/(double)n);
return ;
}

基环树DP,先处理环外的子树,在递归处理环上的点。

bzoj 2878: [Noi2012]迷失游乐园的更多相关文章

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

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

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

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

  3. bzoj 2878: [Noi2012]迷失游乐园【树上期望dp+基环树】

    参考:https://blog.csdn.net/shiyukun1998/article/details/44684947 先看对于树的情况 设d[u]为点u向儿子走的期望长度和,du[u]为u点的 ...

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

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

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

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

  6. BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

    2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved:  ...

  7. [bzoj2878][Noi2012]迷失游乐园(基环树dp)

    [bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...

  8. 【BZOJ 2878】 [Noi2012]迷失游乐园

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

  9. NOI2012 : 迷失游乐园

    终于补完NOI2012了好开心~ 题目大意:给定一棵树或者环套外向树,求出从中随机选一条简单路径的期望长度,环上点数不超过20. 设 d[x]表示x的度数,ch[x]表示x孩子个数 up[x]表示x向 ...

随机推荐

  1. JQuery MultiSelect(左右选择框)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 通过setDB2Client*来方便的使用TRACE调优jdbc程序

    一般来说通过TRACE的report来分析DDF的性能问题的话,基本对DBA都是噩梦一样.因为所有的Thread都是通过DDF一个类型的Thread,所以不管你怎么分类,看Accounting rep ...

  3. Frag(匹配跟踪)

    ‘碎片’(Frag)跟踪是目标跟踪里的一种通过‘部分‘匹配识别的方法,其目标模板是通过图像多个碎片和块来描述.块是任意的,不基于目标模型的(与传统的基于’部分‘的方法不一样,比如人体的四肢与躯干的跟踪 ...

  4. [转] 关于ubuntu的sources.list总结

    点击阅读原文 一.作用 文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器的地址.和sources.list功能一样的是/etc/apt/s ...

  5. python: HTML中的选择器

    id选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. GMF中,删除节点和连线的另一种实现

    问题 在GMF中,如果需要programmatically删除节点或连线,在google中我们很容易搜索到<GMF中,删除节点和连线的实现>一文(我并不确定这是原创作者的原始链接),很多人 ...

  7. c++链表归并排序的迭代版本

    之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...

  8. SQL GROUP BY 后排序

    由于GROUP BY 使用Sum函数后 ID等唯一值就无法查询出来了,所以想按照ID排序也就不可以了. 这时可以使用一个MIN 或者MAX函数来取得一个最小或者最大的ID 这样就可以实现以其中一条ID ...

  9. 我的android学习经历39

    关于像第一次进qq一样的那个渐变企鹅图的制作 渐变动画 package com.moonweather.app.activity; import com.moonweather.app.R; impo ...

  10. 使用phantomjs操作DOM并对页面进行截图需要注意的几个问题

    phantomjs是一个无界面浏览器,可用于网页截图和前端自动化测试,基于webkit内核(也就是chrome使用的内核),并使用js编写业务脚本来请求.浏览和操作页面.最近前端监控需要用到phant ...