长大校赛G(树的直径+图论)

5人阅读 评论(0) 收藏 举报
分类:

看错题意以为这题不可做。。其实傻逼得很qaq

距离和一定,要使访问的点最多,最显然的办法是走成一条链。。那么就要找离该点距离最大的点,而这个点显然是直径端点,为此需要先求出直径。。。

然后距离和可能会比链长还要再长,即我们还可以访问更多的点,在这链的基础之上,每多访问一个点的代价是2(以链上一点向外延伸一个小分支,这个小分支还有来回,在这个分支的基础上再延伸也是2),那么把剩余的距离除以2就可以得出还可以访问的点了。。

当然点数肯定不能超过n,记得特判即可。。。





/**
 *        ┏┓    ┏┓
 *        ┏┛┗━━━━━━━┛┗━━━┓
 *        ┃       ┃  
 *        ┃   ━    ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ...  ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ Code is far away from bug with the animal protecting          
 *          ┃   ┃   神兽保佑,代码无bug
 *          ┃   ┃           
 *          ┃   ┃        
 *          ┃   ┃
 *          ┃   ┃           
 *          ┃   ┗━━━┓
 *          ┃       ┣┓
 *          ┃       ┏┛
 *          ┗┓┓┏━┳┓┏┛
 *           ┃┫┫ ┃┫┫
 *           ┗┻┛ ┗┻┛
 */ 
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,l,r) for(int i=l;i>=r;i--)
#define link(x) for(edge *j=h[x];j;j=j->next)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define eps 1e-12
#define succ(x) (1<<x)
#define lowbit(x) (x&(-x))
#define sqr(x) ((x)*(x))
#define mid (x+y>>1)
#define NM 100005
#define nm 200005
#define pi 3.1415926535897931
using namespace std;
const ll inf=998244353;
ll read(){
    ll x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return f*x;
}



struct edge{int t;edge*next;}e[nm],*h[NM],*o=e;
void add(int x,int y){o->t=y;o->next=h[x];h[x]=o++;}

int n,m,d[NM],b[NM],f[NM],_x,_y;
void dfs(int x){
	link(x)if(!f[j->t]){
		f[j->t]=x;d[j->t]=d[x]+1;
		dfs(j->t);
	}
}

int main(){
	int _=read();
	while(_--){
		n=read();mem(d);mem(f);mem(e);mem(h);o=e;
		inc(i,1,n-1){_x=read();_y=read();add(_x,_y);add(_y,_x);}
		dfs(f[1]=1);_x=_y=1;
		inc(i,1,n)if(d[i]>d[_x])_x=i;
		mem(f);mem(d);dfs(f[_x]=_x);
		inc(i,1,n)b[i]=d[i];
		inc(i,1,n)if(d[i]>d[_y])_y=i;
		mem(f);mem(d);dfs(f[_y]=_y);
		m=read();
		while(m--){
			int x=read(),t=read();
			if(d[x]>b[x])printf("%d\n",d[x]<t?min(n,d[x]+1+(t-d[x])/2):t+1);
			else printf("%d\n",b[x]<t?min(n,b[x]+1+(t-b[x])/2):t+1);
		}
	}
	return 0;
}





链接:https://www.nowcoder.com/acm/contest/102/G
来源:牛客网
Go For Travel

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

There are n cities in the Rainbow Island, connected by n−1 bidirectional roads.
Lizishu is fond of travel. In the ith of each m years, she would go for travel from city xi with kiYuan and she would cost 1 Yuan leaving a city to an adjacent one. For seeing more scenery, she wants to go to as many different cities as possible.
Now you are given the map of the Rainbow Island and you should tell Lizishu the maximum number of different cities (including xi) she can reach every year.
Note that every time she can only go to an adjacent city and cost 1 Yuan.

输入描述:

The first line contains an integer number T, the number of test cases.
For each test case :
The first line contains an integer n(1 ≤ n ≤ 105), the number of vertices.
The following n−1 lines, each contains two integers u,v(1 ≤ u,v ≤ n), which means there is an edge between u and v.
It is guaranteed that the graph is connected.
The next line contains an integer m(1 ≤ m ≤ 106), the number of years.
The following m lines, the ith line contains two integers xi(1 ≤ xi≤ n),ki(1 ≤ ki≤ 106), the index of the city she starts travel and the money she carries in the ith year.

输出描述:

For each year print the answer.
示例1

输入

1
6
1 2
1 3
2 4
2 5
3 6
2
2 2
2 4

输出

3
4

查看评论

第3周:决策树模型(CART)、基于树的集成学习算法(随机森林、GBDT)-人工智能工程师直通车

本课程共分为三个阶段。从机器学习到深度学习,再到项目实战,循序渐进,层层深入。除了系统讲解成为一名人工智能工程师所需的理论知识外,每节课还会配有实战案例,通过练习巩固所学知识,学以致用解决实际问题。第三个阶段包含四个大型工业级综合实战案例,采用大量真实数据集,完美模拟工作场景。学完后,大家绝对可以胜任人工智能领域相关工作。
  • 2017年11月13日 11:26

图论中直径和半径

定义如下: 在图G中d(u,v),定义为图中顶点u到顶点v的一条最短路径。 如果没有路径d(u,v)定义为无穷大。 直径: 定义为max d(u,v),其中u,v是两个顶点。也就是图中...
  • s1102379635
  • s1102379635
  • 2013-01-21 14:17:40
  • 5074

3124: [Sdoi2013]直径【dfs】【树的直径】【外向树】

**Description**小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路...
  • fd_xuan
  • fd_xuan
  • 2016-03-11 23:41:53
  • 442

树的直径,树的重心,树的分冶

主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的...
  • pi9nc
  • pi9nc
  • 2013-10-07 17:26:10
  • 9629

图的半径

题目大意给定无向图,求图的半径。 图的半径定义:找到图上一点(可以在边上),使得其余所有点到该点最短路最大的那个最小,这个最小的最大最短路就是图的半径。该点称为中心。观察先做floyd跑双源最短路 ...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2016-11-10 16:49:54
  • 423

求树的直径算法

/*树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径; 原理: 设起点为u...
  • xiaotan1314
  • xiaotan1314
  • 2016-11-04 13:25:12
  • 1777

图论中树的基本概念总结

给出树,支撑树的概念
  • yyywww666
  • yyywww666
  • 2015-12-22 08:43:39
  • 4056

树形dp题集之树的直径

【codeforces 592D】 #include using namespace std; #define inf 130000 vectoradj[inf]; int vis[inf]; in...
  • saragrean
  • saragrean
  • 2015-11-06 22:29:44
  • 510

两次BFS求树的直径(算法导论22.2-7)

以任意点w开始,先做一次BFS,找到最远的点v,然后再以此点v进行一次BFS,找到最远的点为u,u到v就是树的直径。   此问题的关键不是在编程,而是要证明,网上也找了很多资料,没有看到证明,以下是个...
  • wdq347
  • wdq347
  • 2013-07-15 09:08:32
  • 3464
    个人资料
    持之以恒
    等级:
    访问量: 5404
    积分: 1337
    排名: 3万+
    最新评论