bzoj2878
又是环套树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的更多相关文章
- 【bzoj2878】 Noi2012—迷失游乐园
http://www.lydsy.com/JudgeOnline/problem.php?id=2878 (题目链接) 题意 求基环树上以任意点为起点的简单路径期望长度. Solution 啊啊啊好丑 ...
- BZOJ2878 NOI2012迷失游乐园(树形dp+环套树+概率期望)
考虑树的部分分怎么做.令f[i]为i向子树内走的期望路径长度,转移比较显然.算答案时先把其父亲的答案弄好就可以统计自己的答案了. 环套树也类似.树里直接dp,对环上点暴力考虑环上的每条路径,算完后再在 ...
- BZOJ2878 [Noi2012]迷失游乐园 【基环树 + 树形dp + 期望dp】
题目链接 BZOJ2878 题解 除了实现起来比较长,思维难度还是挺小的 观察数据范围发现环长不超过\(20\),而我们去掉环上任何一个点就可以形成森林 于是乎我们枚举断掉的点,然后只需求出剩余每个点 ...
- 【BZOJ2878】【NOI2012】迷失游乐园(动态规划)
[BZOJ2878][NOI2012]迷失游乐园(动态规划) 题面 BZOJ 题解 记得以前考试的时候做过这道题目 这题的暴力还是非常显然的,每次\(dfs\)一下就好了. 时间复杂度\(O(n^2) ...
- [BZOJ2878][NOI2012]迷失游乐园(环套树DP+概率)
推荐讲解:https://www.cnblogs.com/Tunix/p/4561493.html 首先考虑树的情况,就是经典的树上概率DP.先DP出down表示从这个点向儿子走能走的期望长度,再DP ...
- [bzoj2878][Noi2012]迷失游乐园(基环树dp)
[bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...
- BZOJ2878 [Noi2012]迷失游乐园
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 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条道路的无向连通图,且该图中至多有一个环 ...
随机推荐
- 1515 跳 - Wikioi
题目描述 Description邪教喜欢在各种各样空间内跳.现在,邪教来到了一个二维平面.在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点:(x-1,y), (x+1,y ...
- 数字PID控制算法
增量式PID控制算法 量式PID控制算法 2009-07-18 10:33 (转载 出处blog.ednchina.com/tengjingshu )blog.ednchina.com/tengjin ...
- [转载]淘宝API调用 申请 获取session key
http://www.cnblogs.com/zknu/archive/2013/06/14/3135527.html 在调用淘宝的API时,我们都会用到appkey,appsecret,appses ...
- vs2010 mvc3创建的razor引擎模板页,子页面引用后出现当前上下文中不存在名称“ViewBag”
View文件夹下缺少Web.config
- [C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C
http://www.geeksforgeeks.org/g-fact-95/ 1 在C语言中,如果函数在声明之前被调用,那么编译器假设函数的返回值的类型为INT型, 所以下面的code将无法通过编译 ...
- 关于JS及应用程序开发的一些体会
代码通常从 一,生命周期 二,业务流程 这几方面来看. JS Client可以和Server端分离. JS端的生命周期. Server端就是 JS能处理的只是HTTP协议.
- 6 个基于 jQuery 的表单向导插件推荐
表单向导可以很好地引导用户进行一步一步的操作,从而降低用户错误输入的几率.尽管互联网中有大量的类似插件,但真正好用的不多. 本文整理了6个比较优秀的表单向导插件,希望能够为你带来帮助. 1. Smar ...
- git安装及使用
一.安装 1.从http://code.google.com/p/msysgit/下载Git-1.8.4-preview20130916.exe,并安装. 2.新建git目录,右键选择Git Bash ...
- 深入浅出ES6(六):解构 Destructuring
作者 Jason Orendorff github主页 https://github.com/jorendorff 什么是解构赋值? 解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性 ...
- SDUT1500 Message Flood
以前做过的用的字典树,可是貌似现在再用超内存....求解释... 问了LYN用的map函数做的,又去小小的学了map函数.... http://wenku.baidu.com/view/0b08cec ...