无向连通树即其直径定义
有一无向连通树,该树的直径就是树上最远两点的距离。
无向连通树: 从一个顶点出发能够到达任意一个顶点,且有n个顶点,n-1条边,没有环。
如何求直径
深度优先遍历
深度优先遍历。先从任意一个顶点 u 出发寻找以其为起点的最长路径,再从终点出发寻找以该终点 s 为起点的最长路径。以该终点为起点的最长路径即为树的直径。
证明:
- 如果u是树直径(最长路径) s -> t上的一点,那么以u为起点寻找最长路径,终点一定是s或t。
- 如果u不是树直径(最长路径) s -> t上的一点,那么又分为两种情况
a. 以点u搜到的最远点形成的路径与s->t有交点x,x是直径上的一点,又回到第一种情况。
b:以点u搜到的最远点为T的路径与s->t没有交点,又因为是连通的,那么可以从u走出一条路,该路与s->t有交点k。那么如图
那么 dist(u,T) > dist(u,k) + dist(k,t)
–>dist(u,T) > dist(k,t)
–>dist(u,T) + dist(s,k)+dist(u,k) > dist(k,t) + dist(s,k) = dist(s,t)
那么最长路就变成了dist(u,T) + dist(s,k)+dist(u,k)。与假设矛盾。
树形DP
例题
使用深度优先遍历解决:
public class Solution {
class Interval {
int start;
int end;
}
/**
* 边
* 在本题中,起点、终点、长度都相同就算同一条边
* 甚至每两个点之间最多只会有一条边
*/
class Edge {
int start, end;
int len;
public Edge(int start, int end, int len){
this.start = start;
this.end = end;
this.len = len;
}
public Edge(){
}
@Override
public int hashCode(