题意:

     给你一棵树,让你再里面选取两个点作为**点,然后所有点的权值是到这两个点中最近的那个的距离,最后问距离中最长的最短是多少,输出距离还有那两个点(spj特判)。

思路:

     现场赛的时候我们压根就没看这道题,还有k题也是水题,可惜当时我们读的题意不对<以为数字可以随意断开,然后拼接的数组可以再段。。>,最后只过了3个题,拿了个铜,不过没啥遗憾,因为这是第一次去亚洲赛,没空手而归就是好事,下几场放开了打就行了。

回到这个题目,其实这个题目我们可以判定的是这两个点分别"罩着"两棵树<原因是最后的答案已经是小于等于树的直径的一半的,如果在同一侧,那么答案就大于等于直径的一半了>,这两颗树一定是整个树从直径断开的分成的两颗树,那么我们就两遍广搜分成两颗树,然后再在两颗树上分别找直径,然后两个点就是直径的中点,然后答案就是两个塔到所有自己所在的那颗子树上所有点的最大距离的最大距离,其他的还有一些细节,比如分成两颗树后有一棵树只剩1个点的时候,去中点可能弄错,这个地方注意点,具体细节可以看代码

#include<stdio.h>
#include<string.h>
#include<queue> #define N_node 200000 + 10
#define N_edge 400000 + 20 using namespace std; typedef struct
{
int node ,t;
}NODE; typedef struct
{
int to ,next;
}STAR; NODE xin ,tou;
STAR E[N_edge];
int list[N_node] ,tot;
int mer[N_node] ,mark[N_node];
int root[N_node]; void add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
E[++tot].to = a;
E[tot].next = list[b];
list[b] = tot;
} int maxx ,mknode;
void BFS(int s ,int aa ,int bb)
{
queue<NODE>q;
memset(mark ,0 ,sizeof(mark));
xin.node = s ,xin.t = 0;
mark[s] = 1;
q.push(xin);
maxx = 0 ,mknode = s;
while(!q.empty())
{
tou = q.front();
q.pop();
if(maxx < tou.t)
{
maxx = tou.t;
mknode = tou.node;
}
for(int k = list[tou.node] ;k ;k = E[k].next)
if(!mark[E[k].to])
{
xin.node = E[k].to;
xin.t = tou.t + 1;
if(aa == tou.node && bb == xin.node || aa == xin.node && bb == tou.node)
continue;
mer[xin.node] = tou.node;
mark[E[k].to] = 1;
q.push(xin);
}
}
} int main ()
{
int n ,t ,i ,a ,b;
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
memset(list ,0 ,sizeof(list)) ,tot = 1;
for(i = 1 ;i < n ;i ++)
{
scanf("%d %d" ,&a ,&b);
add(a ,b);
} BFS(1 ,-1 ,-1);
int mk1 = mknode;
BFS(mk1 ,-1 ,-1);
int mk2 = mknode;
int nowid = 0;
int x = mk2;
while(x != mk1)
{
root[++nowid] = x;
x = mer[x];
} root[++nowid] = mk1; int aa = root[nowid/2];
int bb = root[nowid/2+1]; BFS(aa ,aa ,bb);
mk1 = mknode;
BFS(mk1 ,aa ,bb);
mk2 = mknode;
nowid = 0;
x = mk2;
while(x != mk1)
{
root[++nowid] = x;
x = mer[x];
}
root[++nowid] = mk1; //for(i = 1 ;i <= nowid ;i ++)
//printf("%d *\n" ,root[i]);
//puts(""); int aaa = root[nowid/2+1]; BFS(bb ,aa ,bb);
mk1 = mknode;
BFS(mk1 ,aa ,bb);
mk2 = mknode;
nowid = 0;
x = mk2;
while(x != mk1)
{
root[++nowid] = x;
x = mer[x];
}
root[++nowid] = mk1;
int bbb = root[nowid/2+1]; BFS(aaa ,aa ,bb);
int Ans1 = maxx;
BFS(bbb ,aa ,bb);
int Ans2 = maxx;
int Ans = Ans1 > Ans2 ? Ans1 : Ans2;
printf("%d %d %d\n" ,Ans ,aaa ,bbb);
}
return 0;
}

Building Fire Stations 39届亚洲赛牡丹江站B题的更多相关文章

  1. Known Notation 39届亚洲赛牡丹江站K题

    题意:       题意,哎!说道题意就蛋疼啊,比赛的时候就愣是把这个题目读成数字可以随意组合,比如123 可以拆成1 23 ,12 3 ,1 2 3,结果显然,水题当神题,各种想不出来,然后就显然的 ...

  2. Average Score39届亚洲赛牡丹江站A题

    题意:       A班有n个人,B班有m个人,然后现在给你n-1个A班人的成绩,和m个B班人的成绩,然后题目要求求出A班剩下的没给成绩那个人的成绩范围,要求是这个人从A班转到B班后能使A,B的平均分 ...

  3. zoj 3820 Building Fire Stations 树的中心

    Building Fire Stations Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge ...

  4. ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

    题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...

  5. zoj 3820 Building Fire Stations (二分+树的直径)

    Building Fire Stations Time Limit: 5 Seconds      Memory Limit: 131072 KB      Special Judge Marjar ...

  6. zoj 3820 Building Fire Stations(二分法+bfs)

    题目链接:zoj 3820 Building Fire Stations 题目大意:给定一棵树.选取两个建立加油站,问说全部点距离加油站距离的最大值的最小值是多少,而且随意输出一种建立加油站的方式. ...

  7. 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-A ( ZOJ 3819 ) Average Score

    Average Score Time Limit: 2 Seconds      Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...

  8. zoj 3822 Domination 概率dp 2014牡丹江站D题

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  9. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

随机推荐

  1. [msys2]集成到右键菜单

    集成到右键菜单 在资源管理器中,空白处右键(right-clicking on folder backround in Windows Explorer)会弹出菜单,其中有如"在此处打开cm ...

  2. CCF(压缩编码):动态规划+平行四边形优化

    压缩编码 201612-4 一开始看这题还以为是哈夫曼编码的题目,结果是哈夫曼题目的变形. 哈夫曼编码是每次合并任意两堆石子,而这里的题目是合并相邻的两堆石子,而且这里的合并花费是合并两堆石子加上所有 ...

  3. 使用 SVG transform rotate 解决画框中的数字跟随旋转的问题

    问题描述 在图片上画框标注数字,旋转画布后,数字随之旋转,可读性不强,要求修改成无论画布怎么旋转,数字都是正向显示~ 原交互图示: 解决方案 先看下 dom 的结构 然后看下下面简单的代码 // 获取 ...

  4. 鸿蒙开源第三方件组件——轮播组件Banner

    目录: 1.功能展示 2.Sample解析 3.Library解析 4.<鸿蒙开源第三方组件>系列文章合集 前言 基于安卓平台的轮播组件Banner(https://github.com/ ...

  5. postman接口测试之设置全局变量和设置环境变量和全局变量

    一.概念 1.环境变量 就是接口的域名或IP地址. 2.全局变量 就是一个作用域为整个postman的变量. 二.使用场景 1.环境变量 在测试的过程中,经常会频繁切换环境,本地环境验证.发布到测试环 ...

  6. Java 面向对象 02

    面向对象·二级 构造方法Constructor概述和格式 * A:构造方法概述和作用     * 给对象的数据(属性)进行初始化 * B:构造方法格式特点     * a:方法名与类名相同(大小也要与 ...

  7. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  8. python列表,元组,字典,集合的比较总结

    这四个都是python中的序列,用于存放数据,他们区别总结如下:   列表list 元组tuple 字典dictionary 集合set 是否可变 可变 不可变 可变 可变 是否有序 有序 有序 无序 ...

  9. 19. 一文搞懂 Go Modules 前世今生及入门使用

    Hi,大家好. 我是明哥,在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 <Go编程时光>,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适 ...

  10. python-递归函数和内置函数笔记汇总

    1. def syz(*args)    #    *args  参数组 不必填,不限制参数的个数    参数组不常用 2.def sys2(**kwargs): #关键字参数 3.递归函数,  不常 ...