Search For Mafuyu dfs,树的遍历,期望(济南)

在这里插入图片描述
题意 :

  • 给定一棵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 n1
  • 先假设走的路径是一个欧拉遍历。容易发现交换一个点的两颗子树答案不变
  • 有了上述结论之后,容易证明最优解确实是一个欧拉遍历,也就是不会半途返回
  • 按任意顺序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));
    }
}

猜你喜欢

转载自blog.csdn.net/m0_51448653/article/details/121415495