题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n)个点,至少需要走多少距离(每条边的距离是1);

思路:树形dp求树的直径r;

a:若k<=r+1 ,ans = k-1;

b:若k>=r+1,ans = r+(k-(r+1))*2;

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 999999999
#define N 110000
struct node {
int u,v,next;
}bian[N*2];
int dis[N],head[N],yong;
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
int visit[N],n,m;
int spfa(int u) {
int i,v;
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
queue<int>q;
q.push(u);
visit[u]=1;
while(!q.empty()) {
v=q.front();
// printf("%d\n",v);
q.pop();
for(i=head[v];i!=-1;i=bian[i].next)
if(visit[bian[i].v]==0) {
dis[bian[i].v]=dis[v]+1;
visit[bian[i].v]=1;
q.push(bian[i].v);
}
}
int ma=1;
for(i=1;i<=n;i++)
if(dis[ma]<dis[i])
ma=i;
// printf("%d\n",dis[ma]);
return ma;
}
int main() {
int t,a,b,len,i;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
yong=0;
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) {
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
}
len=dis[spfa(spfa(1))]+1;
//printf("%d\n",len);
while(m--) {
scanf("%d",&a);
if(a<=len)
printf("%d\n",a-1);
else
printf("%d\n",len-1+(a-len)*2);
}
}
return 0;
}

hdu 4607 树形dp 树的直径的更多相关文章

  1. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. hdu 4607 (树形DP)

    当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...

  3. Computer(HDU2196+树形dp+树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题目: 题意:有n台电脑,每台电脑连接其他电脑,第i行(包括第一行的n)连接u,长度为w,问你每 ...

  4. computer(树形dp || 树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  6. POJ 3162.Walking Race 树形dp 树的直径

    Walking Race Time Limit: 10000MS   Memory Limit: 131072K Total Submissions: 4123   Accepted: 1029 Ca ...

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

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

  8. poj3162 树形dp|树的直径 + 双单调队列|线段树,好题啊

    题解链接:https://blog.csdn.net/shiqi_614/article/details/8105149 用树形dp是超时的,, /* 先求出每个点可以跑的最长距离dp[i][0|1] ...

  9. hdu-2169 Computer(树形dp+树的直径)

    题目链接: Computer Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. ant整合junit自己主动化測试

    一. 使用Junit进行測试 1. Java业务代码: public class HelloWorld { // 測试返回"world" public String hello() ...

  2. HDU--1558--Segment set--并查集***经典***

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. Hadoop Web项目--Friend Find系统

    项目使用软件:Myeclipse10.0,JDK1.7,Hadoop2.6,MySQL5.6.EasyUI1.3.6.jQuery2.0,Spring4.1.3. Hibernate4.3.1,str ...

  4. CodeForces 486B

    Let's define logical OR as an operation on two logical values (i. e. values that belong to the set { ...

  5. oracle中关于删除表purge语句和闪回语句的基本使用

    语法: drop table ... purge; 例子:drop table test purge; purge是直接删除表,不保留到回收站,10G开始默认drop表式改名移动到回收站; 闪回(fl ...

  6. DBS-PowerDesginer:PowerDesigner最基础的使用方法入门学习

    ylbtech-DBS-PowerDesginer:PowerDesigner最基础的使用方法入门学习 1.返回顶部 1. 1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其 ...

  7. php 获取随机字符串(原创)

    //获取随机数字字母字符串 function get_rand_str($len=8){ $randArr=array_merge(range(0,9),range('a','z'),range('A ...

  8. JavaScript操作HTML&CSS简单入门

    - Java攻城狮学习路线 - 一. JavaScript基础 输出 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML 文档中. 使用 ...

  9. (转)微服务架构 互联网保险O2O平台微服务架构设计

    http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...

  10. jq图片懒加载

    jQuery图片延迟加载插件jQuery.lazyload,使用延迟加载在可提高网页下载速度.在某些情况下,它也能帮助减轻服务器负载. 使用方法 引用jquery和jquery.lazyload.js ...