树的直径

 1 int dfs(int u,int fa){
 2     int d1=0,d2=0;
 3     for(int i=head[u];i;i=e[i].next){
 4         int v=e[i].v;
 5         if(v==fa)
 6             continue;
 7         int d=dfs(v)+e[i].w;
 8         if(d>d1){
 9             d2=d1,d1=d;
10         }
11         else if(d>d2)
12             d2=d;
13     }
14     ans=max(ans,d1+d2);
15     return d;
16 }

可以任取一个节点作为根节点做为根节点,因为这个过程是递归的,可以证明这与取n个节点再求的答案是一样的

posted @ 2022-08-14 17:08  NOI2023  阅读(30)  评论(0)    收藏  举报