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]);