//给一棵双向树,数中边的权值为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. Vue项目启动后首页URL带的#该怎么去掉?

    修改router的mode为history就可以 const router = new VueRouter({mode: 'history', routes: [...]}) 实际修改后需要注意修改a ...

  2. jquery之data()

    $("#test").data("myProp","123") alert($("#test").data(" ...

  3. winform(记事本--剪切复制等和打开)

  4. oracle:储存过程实现分页

    CREATE OR REPLACE PACKAGE PKG_QUERY IS -- Author : ADMINISTRATOR -- Created : 2016/12/8 星期四 10:28:37 ...

  5. JS中sort()方法原理及使用

    说明 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. arra ...

  6. BZOJ5045 打砖块 2017年9月月赛 其他

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5045 题意概括 有一堵墙. 现在挖掉某些砖.如果有相邻的某两个砖没有了,那么他们中上方的那块也没了 ...

  7. java 如何用pattern 和 Matcher 来使用正则表达式

    java的regex库 java里预留了一个regex库,方便于我们在java里操作正则表达式,或者用它来匹配字符串. 其中比较常用的就是 Pattern 和 Matcher ,pattern是一个编 ...

  8. python爬虫积累(一)--------selenium+python+PhantomJS的使用

    最近按公司要求,爬取相关网站时,发现没有找到js包的地址,我就采用selenium来爬取信息,相关实战链接:python爬虫实战(一)--------中国作物种质信息网 一.Selenium介绍 Se ...

  9. POJ 1384 Piggy-Bank【完全背包】+【恰好完全装满】(可达性DP)

    题目链接:https://vjudge.net/contest/217847#problem/A 题目大意:   现在有n种硬币,每种硬币有特定的重量cost[i] 克和它对应的价值val[i]. 每 ...

  10. windows server 2003 安全加固(一)

    windows server 2003 安全加固 加固主要在如下方面 A 升级系统补丁 B NTFS权限合理设置 C 关闭不需要的服务 D 关闭不需要的端口 E 帐号和密码管理 F 开启安全策略 G ...