题意 :
- 给定一棵n个点的树,A在1号点,B的位置在2-n中均匀随机,A不知道B的位置,现在A要去找B,每秒可以走到一个相邻点,求在最优策略( o p t i m a l optimal optimal s t r a t e g y strategy strategy)下的期望时间
思路 :
- 等概率出现,因此直接把所有(2-n)结点需要的次数累加后除以( n − 1 n-1 n−1)
- 先假设走的路径是一个欧拉遍历。容易发现交换一个点的两颗子树答案不变
- 有了上述结论之后,容易证明最优解确实是一个
欧拉遍历
,也就是不会半途返回, - 按任意顺序DFS即可,时间复杂度 O ( n ) O(n) O(n)
- 树的遍历只要传入父节点即可,不需要vis数组
- dfs的方案就是每次回溯回来后cnt还是加一,这样就能构造“走回”的效果;
- 还要注意一开始cnt初始化为-1,因为在第一个点是第0s
#include <iostream>
#include <vector>
#define pb push_back
using namespace std;
const int N = 110;
int n;
vector<int> g[N];
int cnt = -1, ans;
void dfs(int u, int fa)
{
cnt ++ ;
ans += cnt;
for (int i = 0; i < g[u].size(); i ++ )
{
int v = g[u][i];
if (v == fa) continue;
dfs(v, u);
cnt ++ ;
}
}
int main()
{
int _ = 1;
scanf("%d", &_);
while (_ -- )
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) g[i].clear();
cnt = -1, ans = 0;
for (int i = 0, u, v; i < n - 1; i ++ )
{
scanf("%d%d", &u, &v);
g[u].pb(v), g[v].pb(u);
}
dfs(1, 0);
printf("%.10lf\n", ans * 1.0 / (n - 1));
}
}