题目描述:

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

输入:

输入可能包含多个测试案例。
对于每个测试案例,输入的第一行为一个整数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 ;
}

最新文章

  1. select,epoll,poll比较
  2. Mac OS X系统安装盘制作
  3. ASP.NET MVC下的四种验证编程方式[续篇]
  4. Samba文件服务器详细配置步骤
  5. Linux下的Hello world
  6. 模块(configparser+shutil+logging)
  7. java中myeclipse连接mysql问题(java.lang.ClassNotFoundException: com.mysql.jdbc.Driver)
  8. JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址
  9. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)(转载)
  10. eclipse基础及开发插件
  11. SDUT1479数据结构实验之栈:行编辑器
  12. 父 shell,子 shell ,export 与 变量传递
  13. Html5 布局经验分享-第1集
  14. [Javascript] Object.freeze() vs Object.seal()
  15. NotePad++更改背景颜色
  16. python httpConnection详解
  17. 为什么Hbase能实现快速的查询
  18. MyEclipse2016统一字符编码
  19. netty详解之reactor模型
  20. Android Service组件在新进程绑定(bindService)过程

热门文章

  1. HTTP/1.1 持久连接 persistent connection
  2. 在PaaS上开发Web、移动应用(2)
  3. Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
  4. Xmind几个有用的技巧
  5. Selenium私房菜系列9 -- Selenium RC服务器命令行参数列表【ZZ】
  6. Azure 项目构建 – 托管静态网站
  7. MySQL存储过程简介和引擎说明
  8. OpenCV2:直方图
  9. ubuntu 升级到5.1kernel,打开bbr
  10. 二. python函数与模块