10W个点的一棵树,边权为1

求访问K个点要走过的最小路程

BFS求出一条最长路以后,我们可以YY出其他的边都要重复走两次

树上的最长路可以从任意一点开始BFS求出这点的最大距离,再把终点设置为起点再做一次BFS

所以就判断K和最长路间的距离就行了 O(n) 算法

 #include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
//typedef long long LL;
//typedef unsigned long long ULL;
// typedef __int64 LL;
// typedef unisigned __int64 ULL;
#define EPS 1e-8
#define MAXN 100005
#define MAXE 200005
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define MOD 1000000007
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max3(a,b,c) (max(max(a,b),c))
#define min3(a,b,c) (min(min(a,b),c))
#define mabs(a) (((a) < 0) ? (-a) : (a))
#define YES cout<<"YES"<<endl;
#define L(t) (t << 1)
#define R(t) (t << 1 | 1)
#define Mid(a,b) ((a+b)>>1)
#define lowbit(a) (a&-a)
#define FOR(a,b,c) for(int a = b; a < c; a++)
#define FOR2(a,b,c) for(int a = b; a <= c; a++)
#define LOOP(a,b) for(int lop = a; lop < b; lop++)
#define LOOP2(a,b) for(int lop = a; lop <= b; lop++)
//int gcd(int a,int b){ return b?gcd(b,a%b):a; }
//int lcm(int a,int b){ return a*b/gcd(a,b); }
struct Edge
{
int u,v,w; // st,ed,value
int next;
}edge[MAXE];
struct Point
{
int p;
int dis;
Point(int a,int b)
{
p = a;
dis = b;
}
};
int head[MAXN];
bool vis[MAXN];
int cnt ; // num of edge
int n ; // num of point
int m ;
void add(Edge x)
{
edge[cnt].u = x.u;
edge[cnt].v = x.v;
edge[cnt].w = x.w;
edge[cnt].next = head[x.u];
head[x.u] = cnt++;
edge[cnt].v = x.u;
edge[cnt].u = x.v;
edge[cnt].w = x.w;
edge[cnt].next = head[x.v];
head[x.v] = cnt++;
}
int endp;
int bfs(int s)
{
int dis = -INF;
queue<Point> q;
Point p(s,);
q.push(p);
vis[s] = true;
while(!q.empty())
{
int u = q.front().p;
int d = q.front().dis;
if(d > dis)
{
dis = max(dis,d);
endp = u;
}
for(int i = head[u]; i != -; i = edge[i].next)
{
if(!vis[edge[i].v])
{
q.push(Point(edge[i].v,d+));
vis[edge[i].v] = true;
}
}
q.pop();
}
return dis;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
// std::ios::sync_with_stdio(false);
int t;
scanf("%d",&t);
while(t--)
{
cnt = ;
scanf("%d%d",&n,&m);
memset(vis,,sizeof(vis));
memset(edge,,sizeof(edge));
memset(head,-,sizeof(head));
for(int i = ; i < n- ; i++)
{
int a,b;
scanf("%d%d",&a,&b);
Edge E;
E.u = a;
E.v = b;
add(E);
}
int dis1 = bfs();
memset(vis,,sizeof(vis));
int dis = bfs(endp);
for(int i = ; i < m ; i++)
{
int k;
scanf("%d",&k);
if(k- <= dis) printf("%d\n",k-);
else printf("%d\n",dis+*(k-dis-));
}
}
return ;
}

HDU 4607 Park Visit HDU暑期多校1的更多相关文章

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

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

  2. hdu 4607 Park Visit 求树的直径

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

  3. hdu 4607 Park Visit

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

  4. hdu 4607 Park Visit (dfs)

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

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

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

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

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

  7. hdu 4607 Park Visit(树上最长链)

    求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...

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

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

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

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

随机推荐

  1. 目标跟踪--CamShift

    转载请注明出处! !! http://blog.csdn.net/zhonghuan1992 目标跟踪--CamShift CamShift全称是ContinuouslyAdaptive Mean S ...

  2. thinkphp中cookie和session中操作数组的方法

    thinkphp中cookie和session中操作数组的方法 一.ThinkPHP模板中如何操作session,以及如果session中保存的是数组的情况 在ThinkPHP的模板中操作sessio ...

  3. ASE加、解密

    AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. /** * 加密 * * @param content 需要加密的内容 * ...

  4. Java 开源博客 —— Solo 0.6.8 正式版发布了!

    Java 开源博客 -- Solo 0.6.8 正式版发布了,欢迎大家下载.另外,欢迎观摩我们的另一个产品,在线 Golang IDE--Wide! 特性 基于标签的文章分类 博客/标签 Atom/R ...

  5. springmvc使用jQuery.datatable时遇到的错误

    springmvc使用jQuery.datatable时遇到的错误 1正确时返回 josn结果: {,,,,,,,,,,,,,,,,"} 页面显示处理中(processing),列表空白,其 ...

  6. 打印机共享 : 客户端 连接服务器打印机时提示"无法连接到打印机“

    1.就是重启一下服务器端的Print Spooler服务就行了,这么简单! 2.修改打印机的共享名 操作无法完成(错误0x00000709).再次检查打印机名称,并确保打印机已连接到网络.(xp系统本 ...

  7. 再次学习 Iterator 迭代器 与 Generator 生成器

    Iterator : 返回的结果是:{value, done} function chef(foods){ let i = 0; return { next(){ let done = ( i> ...

  8. IT人都欠自已一个Lable Page

    平时, 你是不是喜欢将一些工作或者技术的网站都会Mark一下.慢慢,自已收藏的标签越来越多.收藏后去查找的比较麻烦,而且不是很方便. 下面的文章是介绍我自已是怎么实现一个简单的Lable Page. ...

  9. Intellij IDEA使用指南(持续更新)(转)

    一.项目层面 1.Java开发工具IntelliJ IDEA导入项目 http://jingyan.baidu.com/article/a17d52852118ac8098c8f2c1.html 2. ...

  10. 新浪新闻按keyword抓取实例

    import urllib2 import requests #import MySQLdb import webbrowser import string import re from Beauti ...