树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;
原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点
证明:
1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了
例题:

大臣的旅费

很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。
为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入格式:
输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数
城市从1开始依次编号,1号城市为首都。
接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)
每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

输出格式:
输出一个整数,表示大臣J最多花费的路费是多少。

样例输入:
5
1 2 2
1 3 1
2 4 5
2 5 4

样例输出:
135

样例说明:
大臣J从城市4到城市5要花费135的路费。

资源约定:
峰值内存消耗 < 64M
CPU消耗 < 5000ms

这道题是蓝桥杯省赛(2014年)的最后一道题,测试数据中最大是10000个城市,显然不能选用邻接矩阵(int a[10000][10000]得400MB内存) 所以我们选用树来存放数据(我当时选用是图的邻接表,没有回路的图,其实也是树,实质一样)
我是用深度优先搜索,代码如下:

#include <stdio.h>
#include <stdlib.h>
struct Node{int len;int q;Node *next;
};struct NodeList{Node *firstNode;
};NodeList a[10001]; //存放城市的节点
int b[10001];  //判断是否走过了这个城市
int n;
int at;
int max;
int count;
int cc;void Insert(int p, int q, int d);
void f(int i);int main()
{int i, p, q, d;for (i = 1; i < 10001; ++i){a[i].firstNode = NULL;}scanf("%d", &n);for (i = 1; i < n; ++i){scanf(" %d %d %d", &p, &q, &d);Insert(p, q, d);Insert(q,p,d);}f(1);//用到了树直径知识count = 0;f(cc);printf("%d", (21 + count) * count / 2);return 0;
}void Insert(int p, int q, int d)
{Node *pt = (Node*)malloc(sizeof(Node)), *temp;//没有free内存pt->len = d;pt->q = q;pt->next = NULL;if (a[p].firstNode == NULL){a[p].firstNode = pt;    }else{temp = a[p].firstNode;while (temp->next != NULL){temp = temp->next;}temp->next = pt;}
}void f(int i)
{b[i] = 1;Node *p = a[i].firstNode;while (p != NULL){if (b[p->q] == 0){b[p->q] = 1;max += p->len;if (count < max){cc = p->q;count = max;}f(p->q);max -= p->len;b[p->q] = 0;}p = p->next;}b[i] = 0;
}

刚开始是用邻接矩阵来存放,没有注意到大数据存在,总有50%数据不能通过,后来用邻接表后,程序通过了。

数据结构中树的直径问题相关推荐

  1. 一文了解树在前端中的应用,掌握数据结构中树的生命线

    一文了解树在前端中的应用

  2. 图解:数据结构中的6种「树」,柠檬问你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  3. 图解:数据结构中的6种「树」,你心中有数吗?

    数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习数据结构时候,会遇到各种各样的基础数据结构,比如堆栈.队列.数组.链表.树...这些基本的数据结构类 ...

  4. react 递归遍历四层树结构 遍历分支中的最后一个节点_图解:数据结构中的 6 种树,你心中有数吗?...

    (给算法爱好者加星标,修炼编程内功) 来源:LemonCoder/后端技术学堂(本文来自作者投稿) 数据结构这门课程是计算机相关专业的基础课,数据结构指的是数据在计算机中的存储.组织方式. 我们在学习 ...

  5. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  6. 【译】数据结构中关于树的一切(java版)

    你每天都那么努力,忍受了那么多的寂寞和痛苦.可我也没见你有多优秀. https://user-gold-cdn.xitu.io/2018/4/17/162d1b4c1dd95fa3?w=1080&am ...

  7. 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树

    通常在开始学编程的时候,你会接触一些常用数据结构.到最后一般会学到哈希表.对于修读计算机科学学位的朋友,你通常要上专门的数据结构课,从了解有关链表.队列和栈的各种知识.这些统称为线性数据结构,因为依逻 ...

  8. 心中有“树”!图文并茂介绍数据结构中常见的树(二)

    计算机科学家尼古拉斯·沃斯(Niklaus Wirth)曾说过:编程=数据结构+算法 ,可见数据结构在编程中的重要性. 50 年过去了,计算机行业日新月异,大佬的这句名言是否还适用于当下?使用成熟且丰 ...

  9. 心中有“树”!图文并茂介绍数据结构中常见的树(三)

    在前面两篇文章中,我们简要介绍了数据结构中的各种[树]在搜索.数据库等领域的使用场景,希望对大家有所帮助. 本篇内容,是我们 <心中有"树"> 系列的最后一篇,我会在这 ...

最新文章

  1. Multithread 之 introduction
  2. YUM(Yellow gog Updater Modifie)服务器的配置
  3. MyBtis快速入门
  4. Spark Streaming
  5. 数据库系统的维护与优化(二)
  6. Android:解决魅族5在Logcat下不输出Log.v()日志
  7. mysql c++ 存数组,c++读取数据文件到数组的实例
  8. React开发者工具 React Developer Tools 的下载
  9. ctf 逆向 回顾与总结
  10. mysql 能用compute_SQL compute by 的使用
  11. python中用来返回序列的最大函数_Python内置函数____________用来返回序列中的最大元素。...
  12. H3C交换机配置trunk
  13. 多网聚合路由器全新面世,带来联网新体验
  14. 51单片机之系统指令
  15. java程序代码实现手机号码归属地查询
  16. 你的快递“动”了吗,快递受阻,缺的不止快递小哥
  17. 柳叶刀| 肠道微生物群在神经系统疾病中的作用
  18. GAL GAME 汉化教程攻略从零开始 1
  19. Microsoft Word 设置底纹
  20. Shell攻关之条件判断与流程控制

热门文章

  1. 计算机科学期末网页大作业快看漫画源码(纯享免费版)需要自取免费配置环境
  2. 数据透视表的发明历史
  3. 利用js和jquary制作轮播图
  4. Iass、Psss、Sass、Dass快速记忆
  5. 码农+码农=码农 ?
  6. 4、弱电工程FTTH网络的分光建设及分光比设计
  7. Java 近闻:JDK 20、新的 JEP 草案、JobRunr 6.0、GraalVM 22.3.1
  8. Cocostudio学习笔记(2) Button + CheckBox
  9. METIS-一种图切分的软件包(简介)
  10. 1.6Java-接口、抽象类