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条道路的无向连通图,且该图中至多有一个环 ...
随机推荐
- 怎么让LinearLayout充满ScrollView
ScrollView里只能放一个元素. 当ScrollView里的元素想填满ScrollView时,使用"fill_parent"是不管用的,必需为ScrollView设置: ...
- SCRUM团队的三个角色
Scrum团队中包括三个角色,他们分别是产品负责人.开发团队和 Scrum Master. Scrum 团队是自组织.跨职能的完整团队.自组织团队决定如何最好地完成他们的工作,而不是由团队外的其他人来 ...
- BZOJ 1143: [CTSC2008]祭祀river 最大独立集
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...
- EXT心得--并非所有的items配置对象都属于EXT的内置类
之前我对EXT的items中未指明xtype的配置对象有一个错误的认识--即虽然某个items未指明它下面的某个组件的xtype,但这个组件肯定属性EXT的某个类.然而今天在查看actioncolum ...
- javascript小实例,PC网页里的拖拽(转)
这是现在的效果,可能改了一些,原来的效果是,里面的这张图是可以上下左右拖动的,然后房子上面的显示的楼栋号,也跟着图片一起移动,当时js能力还不行,未能实现项目经理的要求,不过后来项目经理又把这个效果推 ...
- 【BZOJ】【3524】【POI2014】Couriers
可持久化线段树 裸可持久化线段树,把区间第K大的rank改成num即可……(往儿子走的时候不减少) 苦逼的我……MLE了一次(N*30),RE了一次(N*10)……数组大小不会开…… 最后开成N*20 ...
- 中国餐馆过程(CRP)
查如何事先确定聚类簇数目发现的,是对狄利克雷过程的(DP)的一种解释. 假设一个中国餐馆有无限的桌子,第一个顾客到来之后坐在第一张桌子上.第二个顾客来到可以选择坐在第一张桌子上,也可以选择坐在一张新的 ...
- [CF]codeforces round 369(div2)
*明早起来再贴代码 A [题意] 给定n*5的方格 将横向的相邻两个变成+输出 [题解] ... B [题意] 一个n*n的正整数矩阵,有且仅有一个数为0 ,在这个位置填上一个数,使得每一列的和 每一 ...
- Unity3d集成移动MM SDK 2.2的技术要点(坑爹的MM SDK)
原地址:http://dong2008hong.blog.163.com/blog/static/4696882720140423517951/ U3D集成移动MM的SDK绝对是以坑爹为主的东西. 浪 ...
- model对象之setter方法使用,解决去除空格和将数字转成字符串展示方法
1.系统中手机号注册的时候,不能含有前后空格.在model对象中过滤~! private String mobile; public String getMobile() { return mobil ...