树的直径

给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径,即直径是一个 数值概念,也可代指一条路径。

树的直径求法

树形DP

 1 void dp(int x) {
 2     v[x] = 1;
 3     for(int i = head[x]; i; i = net[i]) {
 4         int y = ver[i];
 5         if(v[y]) continue;
 6         dp(y);
 7         ans = max(ans, d[x] + d[y] + edge[i]);
 8         d[x] = max(d[x], d[y] + edge[i]);
 9     }
10 }

 

二次搜索

  1. 从任一点开始遍历,找到最远点p;
  2. 从p开始再次遍历,找到最远点q

原理:p到q就是树的一条直径。因为p必然是直径的一端,否则总能找到一条更长的链,这与直径的定义矛盾。

posted @ 2019-07-28 09:40  然墨  阅读(177)  评论(0编辑  收藏  举报