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. 零基础学python-3.3 标识符

    1.标识符的组成 1)有数字.下划线.英文字母组成 2)第一个字符仅仅能是字母或者下划线 3)大写和小写敏感 标识符通常是变量名称.方法名.类名等 2.keyword python里面有一系列的关键字 ...

  2. 离散化求RECT1

    本文转载至点击打开链接 #include<stdio.h> struct node{ int x1,y1,x2,y2,c; }; struct node s[1010]; int px[2 ...

  3. 《AndroidStudio每日一贴》7. 怎样将本地变更文件移到其他的changelist?

    操作方法: 进入Version Control -> Local Changes ,会显示本地变更列表分组. 假设你想将某个changelist中的文件转移到其他的changelist, 选中此 ...

  4. net.sf.json Maven依赖配置

    转自:https://blog.csdn.net/qq_36698956/article/details/80772984 今天搭框架开始实现前台的json了,于是逐个找适合的框架,发现要实现json ...

  5. Quart 学习

    quartz版本使用2.2.1 梳理一下其中的流程,可以表示为: 0.调度器线程run() 1.获取待触发trigger 1.1数据库LOCKS表TRIGGER_ACCESS行加锁 1.2读取JobD ...

  6. 关于checkbox的一些jquery操作

    表单在前端开发中是经常会遇到的,其中自然也少不了checkbox复选框,对于复选框的操作无外乎有以下三种:全选,全不选,反选.下面零度逍遥就给大家分析分析. 一.checkbox全选 大家都知道选择c ...

  7. cf B. Black Square

    B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. Linux下CD/DVD刻录软件

    1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...

  9. Django transaction 误用之后遇到的一个问题与解决方法

    今天在调试项目开发好的一个模块的时候,发现了一个很诡异的现象,最后追踪发现是因为在项目中事务处理有误所致.这个问题坑了我好一会,所以记录一下,以免再踩坑.下面开始详述. 我们都知道 Django 框架 ...

  10. jQuery.inArray和splice删除数组元素

    不知道数组下标的情况下,删除数组对应元素.实例: var arrays = ['a','b','c','d']; arrays.splice($.inArray('c',arrays),1); ale ...