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条道路的无向连通图,且该图中至多有一个环 ...
随机推荐
- Android应用市场提交入口
应用市场是整个移动生态系统的核心,然而对于中国用户来说,Google Play应用商店却因为种种原因,在中国一直无法长期稳定的运作,又加上Android系统的开源特性,从而在中国造就出大量的第三方应用 ...
- 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项
环境:windows server 2012 asp.net 找到网站目录:wwwroot ,打开web.config文件,在 在<files>与</files>之间加入代码 ...
- 发现一个很好的android开发笔记库
http://linux.linuxidc.com/ 密码和用户名都是www.linuxidc.com android基础教程到高手进阶,游戏开发,数据存储,android架构等.谢谢网站主分享!
- firefox常用扩展、脚本
1.AutoPopup.uc.js:鼠标移到菜单和下拉箭头上自动弹出下拉菜单 2.moveButton.uc.js:移动或克隆按钮或菜单到火狐浏览器的任意位置 moveButton.uc.js使用说明 ...
- hibernate中文乱码问题
在学习hibernate的过程中,发现在往mysql数据库中插入数据的时候会报错. <property name="hibernate.connection.url"> ...
- 各种matrix
http://www.gamedev.net/topic/602722-worldviewproj/
- win8双屏敲代码
23寸,AOC冠杰("AOC I2369V 23英寸LED背光超窄边框IPS广视角液晶显示器(银色)") 某东,920买入.
- javascript背景淡入淡出
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Android开发--Activity生命周期回顾理解
Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...
- Android 父类super.onDestroy();的有关问题
super.onDestroy(); 的问题. 注意:没有显式地在自己的方法中调用父类Activity的onDestroy是会报错的.我的问题很简单,在我覆盖的onDestroy(),方法中需要调用父 ...