题目描述:

给定一棵无向树, 我们选择不同的节点作为根节点时,可以得到不同的高度(即树根节点到叶子节点距离的最大值), 现在求这棵树可能的最低高度。

输入:

输入可能包含多个测试案例。
对于每个测试案例,输入的第一行为一个整数n(1 <= n <= 1000000)。
接下n-1行,每行包括两个整数u,v( 0<= u,v < n)代表这棵树的一个边连接的两个顶点。

输出:

对应每个测试案例,输出这棵树可能的最小高度。

样例输入:
3
0 1
1 2
5
0 1
1 2
1 3
1 4
样例输出:
1
1 这个题技巧性很强,
最小高度为树中两结点最长距离的一半,故关键是求两点间的最长距离
求最长距离时,首先对任一节点进行dfs或bfs,找到其最远距离点,再对此点进行第二次dfs或bfs遍历,得出的距离既是最远距离。
dfs代码如下
 #include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std; vector<int>tree[];
int n;
int visit[];
int maxP, maxDepth; void dfs(int m, int dept) {
if(maxDepth < dept) {
maxDepth = dept;
maxP = m;
}
int sizem = tree[m].size();
for(int i = ; i < sizem; i++) {
int j = tree[m][i];
if(visit[j] == ) {
visit[j] = ;
dfs(j, dept+);
visit[j] = ;
}
}
}
int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
tree[i].clear();
}
int a, b;
n--;
while(n--) {
scanf("%d %d",&a, &b);
tree[a].push_back(b);
tree[b].push_back(a);
}
memset(visit, , sizeof(visit));
maxP = , maxDepth = ;
visit[] = ;
dfs(, ); memset(visit, , sizeof(visit));
maxDepth = ;
visit[maxP] = ;
dfs(maxP, ); int ans = (maxDepth + )/;
printf("%d\n",ans); }
return ;
}

bfs代码如下

 #include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <queue>
using namespace std; vector<int> tree[];
queue<int> treeq;
int n;
int visit[];
int depth[]; int maxP, maxDepth; void bfs() {
while(!treeq.empty()) {
int p = treeq.front();
treeq.pop(); int sizep = tree[p].size();
for(int i = ; i < sizep; i++) {
int j = tree[p][i];
if(visit[j] == ) {
visit[j] = ;
depth[j] = depth[p] + ;
if(maxDepth < depth[j]) {
maxDepth = depth[j];
maxP = j;
}
treeq.push(j);
}
}
}
} int main(int argc, char const *argv[])
{
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
tree[i].clear();
}
int a, b;
n--;
while(n--) {
scanf("%d %d",&a, &b);
tree[a].push_back(b);
tree[b].push_back(a);
}
memset(visit, , sizeof(visit));
maxP = , maxDepth = ; treeq.push();
visit[] = ;
depth[] = ;
bfs(); memset(visit, , sizeof(visit));
maxDepth = ;
treeq.push(maxP);
visit[maxP] = ;
depth[maxP] = ;
bfs(); int ans = (maxDepth + )/;
printf("%d\n",ans); }
return ;
}

九度oj 题目1536:树的最小高度的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  3. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  6. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  7. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. 19/03/04 vue基础整理,webpack基础整理

    gitUrl : https://gitee.com/jinyujiang/vue_basis_example.git (迭代更新) webpack : 有道云笔记分享  以及码云(迭代更新)

  2. SourceInsight主题设置

    自己经常忘记怎样设置SourceInsight主题,这次一定要记住! 0. 退出SourceInsight软件1. 替换配置文件操作:拷贝Global.CF3到“我的文档\Source Insight ...

  3. 解决Unsupported major.minor version 51.0报错问题

    问题产生原因:计算机环境变量的jdk版本与eclipse使用的jdk版本不一致 解决方法: 1.查看计算机环境变量的jdk版本 2.查看eclipse项目java compiler的方法:在项目点右键 ...

  4. Drools应用实例

    Drools 实例介绍 Drools编译与运行: 在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译.规则收集和规则的执行. Kmo ...

  5. kvc to nsdata

        [NSKeyedArchiver archivedDataWithRootObject:arr];    [NSKeyedUnarchiver unarchiveObjectWithData: ...

  6. Codeforces Round #316 (Div. 2) C Replacement 扫描法

    先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数. 对于询问,只要对应位置判断一下是不是'.',以及周围的情况. #include<bits/stdc++. ...

  7. Hermite 矩阵的特征值不等式

    将要学习 关于 Hermite 矩阵的特征值不等式. Weyl 定理 以及推论.   Weyl 定理 Hermann Weyl 的如下定理是大量不等式的基础,这些不等式要么涉及两个 Hermite 矩 ...

  8. VC-基础:隐藏不安全函数的warning-_CRT_SECURE_NO_WARNINGS

    >tmp.cpp(): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strc ...

  9. QT5:先导篇 全局定义

    一.简介 <QtGlobal>头文件包含了Qt类库的一些全局定义,包含基本数据类型 函数和宏 二.全局变量定义 <QtGlobal>定义的数据类型: Qt数据类型        ...

  10. HTML5 Geolocation(地理位置)

    HTML5 Geolocation(地理位置).是用来定位用户的位置的. HTML5 Geolocation API 用于获得用户的地理位置,鉴于该特性可能侵犯用户的隐私权,除非用户同意,否则不能获取 ...