求树上最长链:两遍搜索。

第一次从树上任意点开始,最远点必然是某一条最长链上的端点u。

第二次从u开始,最远点即该最长链的另一端点。

先在最长链上走,不足再去走支链。

把询问数m错打成n,狠狠wa了一次= =

 #include<stdio.h>
#include<string.h> const int MAXN=; struct E{
int v,next;
}e[MAXN<<]; struct Q{
int p,c;
}q[MAXN]; int tol;
int head[MAXN];
int vis[MAXN]; void init()
{
tol=;
memset(head,-,sizeof(head));
} void add(int u,int v)
{
e[tol].v=v;
e[tol].next=head[u];
head[u]=tol++;
} int BFS(int x)
{
int r,l,i;
int u,c;
r=l=;
memset(vis,,sizeof(vis));
vis[x]=;
q[r].p=x;
q[r++].c=;
while(l<r)
{
u=q[l].p;
c=q[l++].c;
for(i=head[u];i!=-;i=e[i].next)
{
int v=e[i].v;
if(!vis[v]){
vis[v]=;
q[r].p=v;
q[r++].c=c+;
}
}
}
return u;
} int main()
{
int T,n,m,i;
int u,v,w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
for(i=;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
u=BFS();
v=BFS(u);
for(i=;i<m;i++)
{
scanf("%d",&w);
if(q[n-].c>=w)
printf("%d\n",w-);
else
printf("%d\n",(q[n-].c-)+(w-q[n-].c)*);
}
}
return ;
}

hdu 4607 Park Visit(树上最长链)的更多相关文章

  1. HDU 4607 Park Visit (DP最长链)

    [题目]题意:N个城市形成一棵树,相邻城市之间的距离是1,问访问K个城市的最短路程是多少,共有M次询问(1 <= N, M <= 100000, 1 <= K <= N). [ ...

  2. 题解报告:hdu 4607 Park Visit(最长链)

    Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par ...

  3. HDU 4607 Park Visit (树的最长链)

    Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  5. hdu 4607 Park Visit 求树的直径

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

  6. hdu 4607 Park Visit

    http://acm.hdu.edu.cn/showproblem.php?pid=4607 先求树的直径 方法:两遍bfs ,任选一点 a  求到a点最远的一点b ,然后 求到b点最远点 c 这样 ...

  7. hdu 4607 Park Visit (dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...

  8. HDU 4607 Park Visit HDU暑期多校1

    10W个点的一棵树,边权为1 求访问K个点要走过的最小路程 BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次 树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再 ...

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

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

随机推荐

  1. 2391: Cirno的忧郁 - BZOJ

    Description Cirno闲着无事的时候喜欢冰冻青蛙.Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有青蛙冰冻.雾之湖生活着m只 ...

  2. oracle——外连接查询

    一.问题描述 有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询. 比如:两个表,产品表和子产品表 注:子产品的parent_product_id ...

  3. C# 虚方法 与 隐藏方法(new) 区别

    重写和隐藏的定义: 重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的          例如:基类方法声明为virtual(虚方法),派生类中使用override申明此 ...

  4. 高性能网络编程2----TCP消息的发送

    转 陶辉 taohui.org.cn 在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字.操作TCP协议发送数据时,面对的是数据流.通常调用诸如send或者write方法来发送数据 ...

  5. uva 11174

    刘书上例题 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> # ...

  6. linux源代码阅读笔记 get_free_page()代码分析

    /* 34 * Get physical address of first (actually last :-) free page, and mark it 35 * used. If no fre ...

  7. 套题T2

    数学(math.cpp) DXY的数学很差... 对于所有1<=i<=N求(2^i – i^2)能被7整除的个数.(N<=1000000) 样例输入: 3 样例输出: 1 你在代码中 ...

  8. Project Euler 81:Path sum: two ways 路径和:两个方向

    Path sum: two ways In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom ...

  9. IDEA查找功能小结

    查找类:Ctrl + N 支持模糊查询

  10. 在屏幕上显示C盘根目录下的所有文件和文件夹

    1 import java.io.File; //在屏幕上显示C盘根目录下的所有文件和文件夹 public class ListDemo { public static void main(Strin ...