又是环套树dp,这次不是我擅长的类型

首先考虑树上的暴力,肯定是穷举起点然后以起点为根dp

我们用g[i]表示以点i为期望走的路径总长,答案就是1/n*Σ(g[i]/d[i]) (d[i]表示点度数)

不难发现我们只需要两次dfs就能求出g[i],即先求出向下的,然后求向上的

具体的,我们设f[x]表示x向孩子走期望路径长度,这个一次dfs就可以求出来,这时候g[x]求出来的是向孩子走期望路径的总长

再做一次dfs,要加上向上走的路径,可以得到g[y]=g[y]+(g[x]-f[y]-w(x,y))/(d[x]-1)+w(x,y) [fa[y]=x] 注意度数为1的点

那么树就搞定了,环怎么做呢?

还是按照基本思路,把环放到根上,求出环上每个点向下的g[x]

注意到题目给出的条件,环上的点很少,因此我们可以暴力依次计算每个点的g[x]

还是类似上面的思路,并不难,注意细节即可

 type node=record
po,next,num:longint;
end; var w,u,f,g:array[..] of double;
cir,v:array[..] of boolean;
fp,fa,d,p,b,q,c:array[..] of longint;
e:array[..] of node;
j,i,n,m,len,x,y,z,s,t:longint;
ans:double; procedure add(x,y,z:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
e[len].num:=z;
p[x]:=len;
inc(d[x]);
end; procedure dfs1(x:longint);
var i,y:longint;
begin
v[x]:=true;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] and not cir[y] then
begin
dfs1(y);
g[x]:=g[x]+f[y]+e[i].num;
end;
i:=e[i].next;
end;
if d[x]> then f[x]:=g[x]/(d[x]-);
end; procedure dfs2(x:longint);
var i,y,k:longint;
begin
v[x]:=true;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if not v[y] and not cir[y] then
begin
k:=d[x]-;
if k= then k:=;
g[y]:=g[y]+(g[x]-f[y]-e[i].num)/k+e[i].num;
dfs2(y);
end;
i:=e[i].next;
end;
end; procedure find(x:longint);
var i,y,z:longint;
begin
inc(t);
b[x]:=t;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if b[y]= then
begin
fa[y]:=x;
fp[y]:=e[i].num;
find(y);
end
else if (y<>fa[x]) and (b[y]<b[x]) then
begin
cir[y]:=true;
z:=x;
inc(s); q[]:=y;
c[]:=e[i].num;
while z<>y do
begin
inc(s);
q[s]:=z;
c[s]:=fp[z];
cir[z]:=true;
z:=fa[z];
end;
end;
i:=e[i].next;
end;
end; begin
readln(n,m);
for i:= to m do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
if m=n- then
begin
dfs1();
fillchar(v,sizeof(v),false);
dfs2();
end
else begin
find();
fillchar(v,sizeof(v),false);
for i:= to s do
begin
x:=q[i];
d[x]:=d[x]-;
dfs1(x);
q[i+s]:=q[i];
c[i+s]:=c[i];
end;
for i:= to s do
begin
for j:=i+s- downto i do
begin
x:=q[j];
if j=i+s- then
begin
z:=d[x];
if z= then inc(z);
u[x]:=g[x]/z;
end
else begin
u[x]:=u[q[j+]]+c[j];
if j<>i then
u[x]:=(u[x]+g[x])/(d[x]+);
end;
end;
for j:=i+ to i+s do
begin
x:=q[j];
if j<>i+s then u[x]:=;
if j=i+ then
begin
z:=d[x];
if z= then inc(z);
u[x]:=g[x]/z;
end
else begin
u[x]:=u[x]+u[q[j-]]+c[j-];
if j<>i+s then
u[x]:=(u[x]+g[x])/(d[x]+);
end;
end;
w[q[i]]:=u[q[i]];
end;
fillchar(v,sizeof(v),false);
for i:= to s do
begin
x:=q[i];
g[x]:=g[x]+w[x];
d[x]:=d[x]+;
end;
for i:= to s do
dfs2(q[i]);
end;
for i:= to n do
ans:=ans+g[i]/d[i];
writeln(ans/n::);
end.

bzoj2878的更多相关文章

  1. 【bzoj2878】 Noi2012—迷失游乐园

    http://www.lydsy.com/JudgeOnline/problem.php?id=2878 (题目链接) 题意 求基环树上以任意点为起点的简单路径期望长度. Solution 啊啊啊好丑 ...

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

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

  3. BZOJ2878 [Noi2012]迷失游乐园 【基环树 + 树形dp + 期望dp】

    题目链接 BZOJ2878 题解 除了实现起来比较长,思维难度还是挺小的 观察数据范围发现环长不超过\(20\),而我们去掉环上任何一个点就可以形成森林 于是乎我们枚举断掉的点,然后只需求出剩余每个点 ...

  4. 【BZOJ2878】【NOI2012】迷失游乐园(动态规划)

    [BZOJ2878][NOI2012]迷失游乐园(动态规划) 题面 BZOJ 题解 记得以前考试的时候做过这道题目 这题的暴力还是非常显然的,每次\(dfs\)一下就好了. 时间复杂度\(O(n^2) ...

  5. [BZOJ2878][NOI2012]迷失游乐园(环套树DP+概率)

    推荐讲解:https://www.cnblogs.com/Tunix/p/4561493.html 首先考虑树的情况,就是经典的树上概率DP.先DP出down表示从这个点向儿子走能走的期望长度,再DP ...

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

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

  7. BZOJ2878 [Noi2012]迷失游乐园

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

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

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

  9. bzoj2878 [Noi2012]迷失游乐园 [树形dp]

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

随机推荐

  1. 【BZOJ】【1834】【ZJOI2010】Network 网络扩容

    网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为 ...

  2. 错误:没有为扩展名“.html”注册的生成提供程序。

    没有为扩展名“.html”注册的生成提供程序.可以在 machine.config 或 web.config 中的 <compilation><buildProviders> ...

  3. asynDBCenter(修改)

    asynDBCenter加入数据库心跳,其实是没有找到更好的方法,看看和以前有什么不同 mongo数据库重练,暂时没有找到好办法,只能这样定时访问 bool asynDBCenter::init(bo ...

  4. tomcat 解析(五)-Tomcat的核心组成和启动过程

    声明:源码版本为Tomcat 6.0.35 前面的文章中介绍了Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话,整个Tomcat ...

  5. What is Object Oriented Design? (OOD)

    Object Oriented Design is the concept that forces programmers to plan out their code in order to hav ...

  6. 数组对象Vector用法

    import java.util.Vector; public class VectorTesting { public static void main(String[] args) { Vecto ...

  7. ElasticSearch Java api 详解_V1.0

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  8. 1829 A Bug's Life

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. 360 chrome 国际版能够隐藏用户保存的密码

    用360 chrome 国际版一段时间了,今天发现它一个优点:取消了浏览器保存的密码明文显示! 原生的chrome和枫树都会明文显示密码,360 chrome国际版则只显示保存了密码的域名和账户名.光 ...

  10. Project Euler 79:Passcode derivation

    Passcode derivation A common security method used for online banking is to ask the user for three ra ...