HDU 4607 Park Visit HDU暑期多校1
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的更多相关文章
- HDU 4607 Park Visit (树的最长链)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- hdu 4607 Park Visit
http://acm.hdu.edu.cn/showproblem.php?pid=4607 先求树的直径 方法:两遍bfs ,任选一点 a 求到a点最远的一点b ,然后 求到b点最远点 c 这样 ...
- hdu 4607 Park Visit (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...
- 题解报告:hdu 4607 Park Visit(最长链)
Problem Description Claire and her little friend, ykwd, are travelling in Shevchenko's Park! The par ...
- HDU 4607 Park Visit 两次DFS求树直径
两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R: ans = ...
- hdu 4607 Park Visit(树上最长链)
求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...
- HDU 4607 Park Visit (DP最长链)
[题目]题意:N个城市形成一棵树,相邻城市之间的距离是1,问访问K个城市的最短路程是多少,共有M次询问(1 <= N, M <= 100000, 1 <= K <= N). [ ...
- HDU 4607 Park Visit(树的直径)
题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...
随机推荐
- bzoj2843极地旅行社题解
题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出yes并修建.改动一个岛上帝企鹅的 ...
- POJ 1887 Testingthe CATCHER (LIS:最长下降子序列)
POJ 1887Testingthe CATCHER (LIS:最长下降子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=200000) ...
- BZOJ 3196 线段树套平衡树
(代码无比丑陋) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int ...
- tomcat7 bootstrap
tomcat7 bootstrap http://t5crambing.iteye.com/blog/1923636
- 访问 IIS 元数据库失败 解决办法
装了VS2005再装IIS,结果出了些小问题访问IIS元数据库失败思考可能是次序出了问题,解决 1.打开CMD,进入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.5 ...
- node.js 中 events emitter 的实现(发布、订阅模式)
const EventEmitter = require('events'); const myEmitter = new EventEmitter(); myEmitter.on('event', ...
- Mysql学习总结(6)——MySql之ALTER命令用法详细解读
MySql语法中Alter命令的用法,这是一个用法比较多的语法,而且功能还是很强大的. [sql] view plaincopy USE learning;(自己要提前建好) CREATE TABLE ...
- Starting nagios:This account is currently not available.
解决方式: 又一次安装php 再重新启动apache 再启动nagios 再訪问:http://ip/nagios 我的问题就是 解决的.
- JAVA多态学习1
多态–概念 所谓多态.就是指一个引用(类型)在不同情况下的多种状态. 也能够理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 实现多态有两种方式:1.继承.2.接口 这一次我们先来演 ...
- Greenplum中定义数据库对象之创建与管理模式
创建与管理模式 概述:DB内组织对象的一种逻辑结构.一个DB内能够有多个模式.在未指定模式时默认放置在public中.能够通过"\dn"方式查看数据库中现有模式. testdw=# ...