//给一棵双向树,数中边的权值为1,问对于这颗树中走k个节点的最短路径

//假设k小于这颗数的直径加1,那么走k个节点就没有反复的路,假设大于

//那么大于的节点都须要走两遍

#include<cstdio>

#include<cstring>

#include<iostream>

#include<queue>

using namespace std ;

const int maxn = 100010 ;

int head[maxn] ;

int vis[maxn] ;

struct Edge

{

    int v ;

    int next ;

}edge[maxn*2] ;

int nedge ;

void addedge(int u , int v)

{

    edge[nedge].v = v ;

    edge[nedge].next = head[u] ;

    head[u] = nedge++ ;

    edge[nedge].v = u ;

    edge[nedge].next = head[v] ;

    head[v] = nedge++ ;

}

queue<int>que ;

int ma = 0 ;

int bfs(int st)

{

    while(que.size())que.pop() ;

    que.push(st) ;que.push(0) ;que.push(0) ;

    int pos ;

    while(que.size())

    {

        int u = que.front() ; que.pop() ;

        int step = que.front() ;que.pop() ;

        int pre = que.front() ; que.pop() ;

        if(step > ma)

        {

            ma = step ;

            pos = u ;

        }

        for(int i = head[u] ; i !=  -1 ;i = edge[i].next)

        {

            int v = edge[i].v ;

            if(v == pre)continue ;

            que.push(v);que.push(step+1);que.push(u) ;

        }

    }

    return pos ;

}

int main()

{

    int t ;

    scanf("%d" , &t) ;

    while(t--)

    {

        int n , m ;

        memset(head ,  -1 ,sizeof(head)) ;

        nedge = 0 ;

        scanf("%d%d" , &n , &m) ;

        for(int i = 1;i < n; i++)

        {

            int u  ,v ;

            scanf("%d%d" , &u , &v) ;

            addedge(u , v) ;

        }

        ma = 0 ;

        int pos = bfs(1) ;

        bfs(pos) ;

        while(m--)

        {

            int k ;

            scanf("%d" , &k) ;

            if(k <= ma+1)printf("%d\n" , k - 1) ;

            else printf("%d\n" , (k - (ma+1))*2+ma) ;

        }

    }

    return 0 ;

}

hdu4607Park Visit 树的直径的更多相关文章

  1. HDU4607 - Park Visit(树的直径)

    题目大意 给定一颗树,要求走过其中连续的k个点,使得步数最少 题解 每条边要么经过两次,要么一次,因为我们的目标就是使得走一次的边尽量的多,这样就转换成求树的直径了,求树的直径我用的是两次dfs,先随 ...

  2. HDU 4607 Park Visit(树的直径)

    题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...

  3. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  4. Park Visit(树的直径)

    传送门 Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. HDU 4607 Park visit (求树的直径)

    解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...

  6. hdu-4612(无向图缩点+树的直径)

    题意:给你n个点和m条边的无向图,问你如果多加一条边的话,那么这个图最少的桥是什么 解题思路:无向图缩点和树的直径,用并查集缩点: #include<iostream> #include& ...

  7. hdu 4607 树形dp 树的直径

    题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1): 思路:树形dp求树的直径r: a:若k<=r+1 ...

  8. Warm up HDU - 4612 树的直径

    题意:给出n个点和m条边的无向图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 题解: 你把这个无向图缩点后会得到一个只由桥来连接的图(可以说这个图中的所有边都是桥,相当于一棵树),然后我们只 ...

  9. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

随机推荐

  1. PYTHON-匿名函数,递归与二分法,面向过程编程

    """匿名函数1 什么是匿名函数 def定义的是有名函数:特点是可以通过名字重复调用 def func(): #func=函数的内存地址 pass 匿名函数就是没有名字的 ...

  2. rownum和分析函数 over

    select rownum, t.* from qyuser.tr_apply_info t where rownum < 10; --rownum 对于满足 查询条件的结果,从1 开始,所以大 ...

  3. Reactor模型-多线程程版

    1.概述 在Reactor单线程版本的设计中,I/O任务乃至业务逻辑都由Reactor线程来完成,这无疑增加了Reactor线程的负担,高负载情况下必然会出现性能瓶颈.此外,对于多处理器的服务器来说, ...

  4. python 全栈开发,Day31(re模块)

    回顾昨天的内容 异常处理 try except 一定要在except之后写一些提示或者处理的内容 try: '''可能会出现异常的代码''' except ValueError: '''打印一些提示或 ...

  5. 【C++ Primer 第11章】2. 关联容器操作

    练习答案 一.访问元素 关联容器额外类型别名  key_type 此容器类型的关键字类型 mapped_type 每个关键字关联的类型,只 适用于map mapped_type 对于set,与key_ ...

  6. poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)

    左边的数字是1 2 3 4 5.... 右边的数字 第一个输入的和1连 第2个输入的和2连 右边再按从小到大排序 要求连线不能交叉 问最多能有多少条不交叉的线 假如右边有5个1 那么答案会是5 所以是 ...

  7. c++ primer 笔记 (二)

    第二章笔记  (貌似记得有点多)   把负值赋给unsigned对象时完全合法的,其结果是该负数对该类型的取值个数求模后的值   -1     (对265求模)  255   float型只能保证6位 ...

  8. k8s 关键字以及管理流程。

    一.流程图如下 二.用户通过kubectl提交需要运行的docker container(pod). 三.api server把请求存储在etcd里面. 四.scheduler(调度)扫描,分配机器. ...

  9. 配置虚拟域名,hosts文件起作用

    快速打开hosts方法 开始->运行->system32->回车 当前路径文件夹drivers\etc\hosts hosts文件起作用,目前楼主知道有两个可能原因 1.刷新dns ...

  10. 6-3 矩阵链成 uva 442

    较为简单的栈题 思路比较好 一次ac 1.char word :word=A:直接  a[word]=xxxx,不用 a[‘word’]=xxxx #include<bits/stdc++.h& ...