树的直径定义为树上两个最远节点之间的最长简单路径
最长简单路径是指树中两个节点之间的路径,该路径不包含任何重复的节点。换句话说,这条路径上的所有节点都是唯一的,没有重复的节点。
树中两次DFS找到的最长路径必定是树的直径(最长的那条路径)
题目 (点击)
【问题描述】
农夫约翰有N个农场,标号为1到N。M条不同的垂直或水平的道路连接着农场,道路的长度不超过1000。这些农场的分布就像下面的地图一样,图中农场用F1..F7表示:
每个农场最多能在东西南北四个方向连接4个不同的农场。此外,农场只处在道路的两端。道路不会交叉且每个农场间有且仅有一条路径。但是约翰丢了农场的地图,他只得从电脑的备份信息中修复了。每一条道路信息描述如下:
从农场23往南经距离10到达农场17
从农场1往东经距离7到达农场17
……
最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松。马拉松路线要尽量长,请帮助约翰寻找两个最远的农场间的距离。
【输入格式】
第1行两个整数N和M。
第2到第M+1行:每行包括4个分开的整数:F1,F2,L,D分别描述两个农场的编号,道路的长度,F1到F2的方向N,E,S,W。
【输出格式】
一个整数,表示最远两个农场的距离。
【输入样例】
7 6
1 6 13 E
6 3 9 E
3 5 6 S
4 1 3 N
2 4 20 W
4 7 2 S
1
2
3
4
5
6
7
【输出样例】
51
1
【样例解释】
最长的马拉松路线通过4,1,6,3到5;总长为:20+3+12+9+7=32。
【数据范围】
1<=N,M<=40000
- 第一次DFS:从任意一个节点开始,进行深度优先搜索,找到距离这个起点最远的节点,记为点Q。由于树是连通的,这次搜索会遍历所有节点,并且能够找到距离初始节点最远的节点Q。
- 第二次DFS:再次进行深度优先搜索,但这次是从点Q出发,寻找距离Q最远的节点,记为点W。同样的道理,这次搜索会找到距离Q最远的节点W。
先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径