题解:
这题不像一般的dp题难在思维。。大概代码细节多一点吧
首先 考虑链,那么就是枚举每个点,o(n)
然后 考虑树
其实问题就是计算每个点出发的期望路径的平均值
考虑树形dp
令f[i]表示i向下走的期望路径,这个显然从根dp一次就可以了
令g[i]表示i向上走的期望路径,此时,记w[i]表示从i走的路径总和(w[i]/n=期望路径,其中n等于它的度)
这时g[i]=(w[fa[i]]-f[i]-v[fa[i],i])/(n-1)+v[fa[i],i]
这样每个点的期望路径就可以o(1)求了
再考虑环上
其实这题环上基本和树上差不多
容易发现环上只有20个点
那么令每个点代表一棵树的树根
然后o(20)枚举从哪个点伸到环中
之后分别做它逆时针走和顺时针走
到达一个新的节点的时候,我们会发现有1/n的概率继续走,这个继续dfs算就可以了
令外就是往它的子树中走
这一部分可以预处理出来
f[i]=(sigma|i=1,n-2|f[son[i]]+v[i,son[i]])/n-1