又是环套树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. iOS VideoToolbox硬编H.265(HEVC)H.264(AVC):1 概述

    本文档尝试用Video Toolbox进行H.265(HEVC)硬件编码,视频源为iPhone后置摄像头.去年做完硬解H.264,没做编码,技能上感觉有些缺失.正好刚才发现CMFormatDescri ...

  2. bnuoj 16493 Just Pour the Water(矩阵快速幂)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=16493 [题解]:矩阵快速幂 [code]: #include <cstdlib> #i ...

  3. Visual Studio 2013无法打开IIS Express Web的解决办法

    1. 首先参考了http://www.cr173.com/html/33412_1.html 2. 参考其最后,从微软官网下载安装WebMatrix,打开WebMatrix. 3. Visual St ...

  4. [sql server、oracle] 分组取最大值最小值常用sql

    sqlserver2005前: --分组取最大最小常用sql--测试环境if OBJECT_ID('tb') is not null drop table tb;gocreate table tb(  ...

  5. SHELL syntax error:unexpected end of file 提示错误

    SHELL syntax error:unexpected end of file 提示错误 if [ -n "$1" ] then " else " fi e ...

  6. Web App之一

    JSP/HTML/CSS---------View(不包含任何的数据,只作为基本的layout) JS------------------------Data(update JSP/HTML)

  7. 【Unity3D】iOS 推送实现

    原地址:http://www.iappfan.com/%E3%80%90unity3d%E3%80%91ios-%E6%8E%A8%E9%80%81%E5%AE%9E%E7%8E%B0/ #impor ...

  8. java001-Helloworld

    public class test05 { public static void main(String[] args) { System.out.println("Hello World! ...

  9. python—命名规范(转)

    文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...

  10. Java并发包中常用类小结(一)

    从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来简单看一下相关的一些常见类的使用情况. 1.ConcurrentHashMap Concurre ...