zoukankan      html  css  js  c++  java
  • HDOJ 4607

         用树形DP找到这颗树距离最远的两个点....对于一个询问K..若小于最远距离..显然只要走最远的这条边走K-1个边就行了..

         当K大于了最远距离..就要去走其他的点...而去其他点必须再回到这个主线..所以要加上(最远距离上点总数-K)*2...


    Program:

    #include<iostream>
    #include<stack>
    #include<queue>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<cmath>
    #define ll long long
    #define oo 1000000007
    #define MAXN 100010
    using namespace std;
    vector<int> Tree[MAXN];
    int dis[MAXN],M;
    void dfs(int x,int f)
    {
          int i,m=Tree[x].size();
          dis[x]=1;
          for (i=0;i<m;i++)
            if (Tree[x][i]!=f)
            {
                   dfs(Tree[x][i],x);
                   M=max(M,dis[x]+dis[Tree[x][i]]);
                   dis[x]=max(dis[x],dis[Tree[x][i]]+1);               
            }
          return;
    }
    int main()
    {   
          int T,i,n,k; 
          scanf("%d",&T);
          while (~scanf("%d%d",&n,&k))
          {
                 for (i=1;i<=n;i++) Tree[i].clear();
                 for (i=1;i<n;i++)
                 {
                        int x,y;
                        scanf("%d%d",&x,&y);
                        Tree[x].push_back(y);
                        Tree[y].push_back(x);
                 }
                 memset(dis,0,sizeof(dis));
                 M=0;
                 dfs(1,0);
                 while (k--)
                 {
                        int x;
                        scanf("%d",&x);
                        if (x<=M) printf("%d
    ",x-1);
                             else printf("%d
    ",M-1+(x-M)*2); 
                 }
          }
          return 0;
    }


  • 相关阅读:
    按升序合并如下两个list, 并去除重复的元素
    python数据结构
    驼峰式命名改下划线命名
    求某个数出现的次数超过了总数的一半
    翻转字符串
    复习
    RESTful
    Flask wtforms
    数据库连接池(DBUtils)
    iOS
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3221526.html
Copyright © 2011-2022 走看看