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

第一次从树上任意点开始,最远点必然是某一条最长链上的端点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. Reactjs相比较原生方案是绝对的快吗?哪些情况下React有优势

    作者:尤雨溪链接:http://www.zhihu.com/question/31809713/answer/53544875来源:知乎著作权归作者所有,转载请联系作者获得授权.   1. 原生 DO ...

  2. HDU 2821 Pusher

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821 首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关 ...

  3. JUnit4的使用

    JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写. 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据.元数据 ...

  4. HDU4725 The Shortest Path in Nya Graph SPFA最短路

    典型的最短路问题,但是多了一个条件,就是每个点属于一个layer,相邻的layer移动,如x层移到x+1层需要花费c. 一种显而易见的转化是我把这些边都建出来,但是最后可能会使得边变成O(n^2); ...

  5. SPOJ 3643 /BNUOJ 21860 Traffic Network

    题意:现在已有m条单向路,问在给你的k条双向路中选择一条,使得s到t的距离最短 思路:设双向路两端点为a,b;长度为c. s到t的有三种情况: 1:原本s到t的路径 2:从s到a,a到b,b再到t的路 ...

  6. POJ 1674

    #include<iostream>//cheng da cai zi 08 .11 .13 using namespace std; int main() { int digit_num ...

  7. java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

    看API文档介绍几个方法:  JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock                    2.接口Conditio ...

  8. 关于ios 8 7 下的模态窗口大小的控制 代碼+場景(mainstoryboard)( Resizing UIModalPresentationFormSheet )

    1 代碼 UIViewController* modalController = [[UIViewController alloc]init];modalController.modalTransit ...

  9. [Hibernate]dynamic-insert和dynamic-update属性

    这二个属性默认情况均为false,你可以通过以下二种方式进行配置使用: 1.Annotation @Entity @Table(name = "stock_transaction" ...

  10. Linux查看机器型号

    dmidecode | grep “Product Name”