#1050 : 树中的最长路

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。

但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手中的这棵玩具树现在由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了不同的数字,并且这些数字都是出于1..N的范围之内,每根木棍都连接着两个不同的小球,并且保证任意两个小球间都不存在两条不同的路径可以互相到达。总而言之,是一个相当好玩的玩具啦!

但是小Hi瞧见小Ho这个样子,觉得他这样沉迷其中并不是一件好事,于是寻思着再找点问题让他来思考思考——不过以小Hi的水准,自然是手到擒来啦!

于是这天食过早饭后,小Hi便对着又拿着树玩具玩的不亦乐乎的小Ho道:“你说你天天玩这个东西,我就问你一个问题,看看你可否知道?”

“不好!”小Ho想都不想的拒绝了。

“那你就继续玩吧,一会回国的时候我不叫上你了~”小Hi严肃道。

“诶!别别别,你说你说,我听着呢。”一向习惯于开启跟随模式的小Ho忍不住了,马上喊道。

小Hi满意的点了点头,随即说道:“这才对嘛,我的问题很简单,就是——你这棵树中哪两个结点之间的距离最长?当然,这里的距离是指从一个结点走到另一个结点经过的木棍数。”。

“啊?”小Ho低头看了看手里的玩具树,困惑了。

提示一:路总有折点,路径也不例外!

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个整数N,意义如前文所述。

每组测试数据的第2~N行,每行分别描述一根木棍,其中第i+1行为两个整数Ai,Bi,表示第i根木棍连接的两个小球的编号。

对于20%的数据,满足N<=10。

对于50%的数据,满足N<=10^3。

对于100%的数据,满足N<=10^5,1<=Ai<=N, 1<=Bi<=N

小Hi的Tip:那些用数组存储树边的记得要开两倍大小哦!

输出

对于每组测试数据,输出一个整数Ans,表示给出的这棵树中距离最远的两个结点之间相隔的距离。

样例输入
8
1 2
1 3
1 4
4 5
3 6
6 7
7 8
样例输出
6

//一棵树的直径就是这棵树上存在的最长路径。
// 任意两点间有唯一路径的无向图是树 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <string>
#include <map>
#include <cmath>
#include <set>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1e5+;
int ans;
bool vis[N];
int dis[N];
int n,point;
struct Node{
int to,w;
Node(){}
Node(int TO,int W){
to=TO;
w=W;
}
}nod[N];
vector<Node>ve[N];
int bfs(int u)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
queue<int>que;
que.push(u);
vis[u]=;
point=;
while(!que.empty()){
int v=que.front();
que.pop();
if(ans<dis[v]){
ans=dis[v];
point=v;
}
for(int i=;i<ve[v].size();i++){//这是树,直接走就可以了。
Node tmp=ve[v][i];
int w=tmp.to;
if(!vis[w]){
vis[w]=;
dis[w]=dis[v]+tmp.w;
que.push(w);
}
}
}
return point;
}
int main()
{
while(~scanf("%d",&n)){
int x,y;
for(int i=;i<n-;i++){
scanf("%d%d",&x,&y);
ve[x].push_back(Node(y,));
ve[y].push_back(Node(x,));
}
ans=;
//int point=bfs(1);
bfs();
ans=;
//cout<<point<<endl;
bfs(point);
printf("%d\n",ans);//树的直径
for(int i=;i<=n;i++) {
ve[i].clear();
}
}
return ;
}

Nordic Collegiate Programming Contest 2015​

A. Adjoin the Networks

One day your boss explains to you that he has a bunch of computer networks that are currently unreachable from each other, and he asks you, the cable expert's assistant, to adjoin the networks to each other using new cables. Existing cables in the network cannot be touched.

He has asked you to use as few cables as possible, but the length of the cables used does not matter to him, since the cables are optical and the connectors are the expensive parts. Your boss is rather picky on cable usage, so you know that the already existing networks have as few cables as possible.

Due to your humongous knowledge of computer networks, you are of course aware that the latency for an information packet travelling across the network is proportional to the number of hops the packet needs, where a hop is a traversal along a single cable. And since you believe a good solution to your boss' problem may earn you that long wanted promotion, you decide to minimise the maximum number of hops needed between any pair of network nodes.

Input Format

On the first line, you are given two positive integers, the number 1 \le c \le 10^51≤c≤105 of computers and the number 0 \le l \le c - 10≤l≤c−1 of existing cables. Then follow ll lines, each line consisting of two integers aa and bb, the two computers the cables connect. You may assume that every computer has a unique name between 00 and n - 1n−1.

Output Format

The maximum number of hops in the resulting network.

样例输入1

6 4
0 1
0 2
3 4
3 5

样例输出1

3

样例输入2

11 9
0 1
0 3
0 4
1 2
5 4
6 4
7 8
7 9
7 10

样例输出2

4

题目来源

Nordic Collegiate Programming Contest 2015​

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long ll;
const int N=1e5+;
bool vis1[N],vis2[N];//同步进行
int c,l;
struct Node{
int to,w;
Node(){}
Node(int TO,int W){
to=TO;
w=W;
}
};
vector<Node>ve[N];
int ans[N],dis[N];
int bfs1(int x)
{
queue<int>q;
vis1[x]=;
dis[x]=;//这样dis 就不用清0了。
q.push(x);
int ret=,point=;
while(!q.empty()){
int v=q.front();
q.pop();
if(ret<dis[v]){
ret=dis[v];
point=v;
}
for(int i=;i<ve[v].size();i++){
Node tmp=ve[v][i];
int w=tmp.to;
if(!vis1[w]){
vis1[w]=;
dis[w]=dis[v]+tmp.w;
q.push(w);
}
}
}
return point;
}
int bfs2(int x)
{
queue<int>q;
vis2[x]=;
dis[x]=;
q.push(x);
int ret=,point=;
while(!q.empty()){
int v=q.front();
q.pop();
if(ret<dis[v]){
ret=dis[v];
point=v;
}
for(int i=;i<ve[v].size();i++){
Node tmp=ve[v][i];
int w=tmp.to;
if(!vis2[w]){
vis2[w]=;
dis[w]=dis[v]+tmp.w;
q.push(w);
}
}
}
return point;
}
bool cmp(int a,int b){
return a>b;
}
int main()
{
scanf("%d%d",&c,&l);
int x,y;
for(int i=;i<l;i++){
scanf("%d%d",&x,&y);
ve[x].push_back(Node(y,));
ve[y].push_back(Node(x,));
}
int t=;
for(int i=;i<c;i++){
if(!vis1[i])//访问过的不再重复
{
int u=bfs1(i);
int v=bfs2(u);
ans[t++]=dis[v];
}
}
sort(ans,ans+t,cmp);
//只能是下面三种情况
int x1=ans[];
int y1=(ans[]+)/+(ans[]+)/+;
int z1=(ans[]+)/+(ans[]+)/+;//l==0时也正确,所有点围成半径为1的圆
int MAX=max(x1,max(y1,z1));
//其他的连在最长直径的子树上,并以圆的形式放置
printf("%d\n",MAX);
return ;
}

hiho 1050 树的直径的更多相关文章

  1. [HIHO] 1050 树中的最长路

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  2. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  3. poj1985 Cow Marathon (求树的直径)

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3195   Accepted: 1596 Case ...

  4. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  5. poj2631 树的直径

    设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...

  6. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

  7. 牡丹江.2014B(图论,树的直径)

    B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

  8. 2227 邮票--FUoj(链接表+树的直径)

    http://acm.fzu.edu.cn/problem.php?pid=2227 我感觉这道题可以随意搞 题目大意: 给你的一个图就是一条链,但是不知道起始点和结束点,而且每个点只会访问一次. 因 ...

  9. hdu 4607 Park Visit 求树的直径

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

随机推荐

  1. HATEOAS REST Service

    用户通过点击页面的href的链接地址,而跳转到其他网页,实现浏览网页的过程了. -> 让调用REST的api就可以实现,类似于用户浏览网页的从一个页面跳转到另外一个页面的过程了 -> 而这 ...

  2. 洛谷 P1969 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  3. 【转】LINQ to SQL语句(1)之Where

    Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形 ...

  4. 关于office转换成pdf组件服务中的DCOM配置问题

    在开始->运行 中录入“dcomcnfg” 单击“确定”后弹出“组件服务”窗口 依次选择“组件服务”->“计算机”->“我的电脑”->“DCOM配置” 在“DCOM配置”下找到 ...

  5. AJPFX辨析Java中堆内存和栈内存的区别

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  6. zuul prefix

    经过测试,书上应该是写错了,如果要全部的路由加前缀,需要将zuul.stripPrefix=true进行设置 而不是书上所说的false

  7. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  8. Generator 和 函数异步应用 笔记

    Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...

  9. 关于验证码在IE中不刷新的快速解决方法

    今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...

  10. ABAP EXCEPTION

    CX_ROOT | |--CX_STATIC_CHECK | |--CX_DYNAMIC_CHECK | | | |--CX_SY_ARITHMETIC_ERROR //运算 '&OPERAT ...