4890. 【NOIP2016提高A组集训第14场11.12】随机游走 (2017.10B组)

https://jzoj.net/senior/#main/show/4890
Description

YJC最近在学习图的有关知识。今天,他遇到了这么一个概念:随机游走。随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次。YJC很聪明,他很快就学会了怎么跑随机游走。为了检验自己是不是欧洲人,他决定选一棵树,每条边边权为1,选一对点s和t,从s开始随机游走,走到t就停下,看看要走多长时间。但是在走了10000000步之后,仍然没有走到t。YJC坚信自己是欧洲人,他认为是因为他选的s和t不好,即从s走到t的期望距离太长了。于是他提出了这么一个问题:给一棵n个点的树,问所有点对(i,j)(1≤i,j≤n)中,从i走到j的期望距离的最大值是多少。YJC发现他不会做了,于是他来问你这个问题的答案。

Input

第一行包含一个整数n,表示点数。
接下来n-1行,第(i+1)行包含两个整数ui和vi,表示树的一条边。

Output

输出一行,包含一个实数,表示最大的期望距离,保留五位小数。

Sample Input

3
1 2
2 3

Sample Output

4.00000

Data Constraint

对于30%的数据,满足n≤5。
对于50%的数据,满足n≤3000。
对于100%的数据,满足n≤100000。

Hint

s=1,t=3,从1走到2距离为1,从2走到3的期望距离d满足d=0.5(d+2)+0.5,解得d=3,所以从1走到3的期望距离为4。
想法:
设up[i]表示i到i的父亲的期望距离
down[i]表示i的父亲到i的期望距离
设dis(u,v)表示u到v的期望距离(u,v相邻)
则dis(u,v)=1/x+(dis(y,u)+1+dis(u,v)(y与u相邻且y!=v))/x
化简得dis(u,v)=x+dis(y,u)
首先每个叶子节点到它的父亲的期望距离为1,然后用上式想上递归求出up,然后用up向下递归求出down
最后设tre[i][1,2,3]分别表示i的子树中,内部的最优答案,一条向上的最长链的长度(终点为i),一条向下的最长链的长度(起点为i)

            tree[x1][1]=max(tree[x1][1],max(tree[y][1],max(tree[y][2]+tree[x1][3]+len[y],tree[y][3]+tree[x1][2]+down[y])));
            tree[x1][2]=max(tree[x1][2],tree[y][2]+len[y]);
            tree[x1][3]=max(tree[x1][3],tree[y][3]+down[y]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值