• hdu4607Park Visit 树的直径


    //给一棵双向树,数中边的权值为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 " , k - 1) ;
                else printf("%d " , (k - (ma+1))*2+ma) ;
            }
        }
        return 0 ;
    }















































  • 相关阅读:
    Spring中的destroy-method方法
    github Pull Request合入全流程介绍
    vue-router动态路由设置参数可选
    github上fork原项目,如何将本地仓库代码更新到最新版本?
    github的pull Request使用
    vue2.X版本vue-cli生成项目后运行失败,报错信息为getaddrinfo ENOTFOUND localhost
    npm在linux即mac下更新时报错
    数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法
    less的使用总结
    ssh连接github连不上
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5422324.html
Copyright © 2020-2023  润新知