2021-ACM-ICPC-济南站 K Search For Mafuyu 【树的遍历与回溯,dfs, 邻接表】

PAT 题目详情 (pintia.cn)

题目

 

 

 

 

 

 题意描述

n个房间, 有n-1个通道, kanade初始在1,Mafuyu 位置未知,求K到M的最小期望,也就是到每个地方的平均值,注意的是这里的求法,队里苦苦想了近一个小时,还是太弱了

比如第二个样例

5

1 2

2 3

3 4

1 5

 

 

 显然,每种方式最后的期望都是一样的,所以最先走哪里无关紧要。

附代码

// #include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;

typedef long long LL;
const int N = 1e5+10;

int e[2*N], h[N], ne[2*N], st[N], idx, d, ans;//记得开2N
int n;

void init()//初始化!!!
{
    idx = 0;
    ans = 0;
    d = 0;
    for(int i = 0; i <= n; i ++)    h[i] = -1, st[i] = 0;//头初始为-1
    
}

void add(int a, int b)//板子
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}

void dfs(int x, int step)
{
    if(step == n)    return;
    
    for(int i = h[x]; i!=-1 ; i = ne[i])
    {
        if(!st[e[i]])//注意是目的地,e[i] 不是i
        {
            st[e[i]] = 1;
            d ++;
            ans = ans + d;
            dfs(e[i], step+1);
            d ++;//回溯
        }
    }
    
}
int main()
{
    int t;
    cin >> t;
    while(t --)
    {
        cin >> n;
        init();
        for(int i = 1; i <n; i ++)
        {
            int a, b;
            cin >> a >> b;
            add(a, b);
            add(b ,a);//双向
        }
        st[1] = 1;
        dfs(1, 1);
        
        printf("%.10lf\n", (double)ans/(double)(n-1));
    }
    return 0;
}

 

 

 

最后的最后, 成功打铁,凉了,但是也知道了不足,基本功不扎实,思维题还出不来,可谓是基础课忘干净,cf没做到位,感觉还不如大一下。

对于cf  首先强化读题(PS:学长看五分钟就知道题意与样例,而我们琢磨了近一小时)

对于基础课,每周复盘一次,拿出一晚上,暂定周五晚,基础课敲板子

复杂的算法有时也是由简单算法的堆积!

暂时这样,后期再制定

posted @ 2021-11-14 21:41  la-la-wanf  阅读(116)  评论(0编辑  收藏  举报