码迷,mamicode.com
首页 > 其他好文 > 详细

树的直径

时间:2020-06-18 23:22:42      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:lan   pre   bool   ons   mes   clu   using   class   turn   

两次\(DFS\)

\(O(n)\)

第一次随机从一个点出发,寻找距离当前点,最远的一个叶子节点,命名为\(rt\)

然后从 \(rt\) 出发,寻找距离\(rt\) 最远的一个叶子节点,这段距离就是树的直径

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int e[N],ne[N],h[N],idx,rt,mx_len;// rt 是第一次dfs后直径的一端,mx_len 存直径的长度
bool vis[N];
void add(int a,int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++; 
}
void dfs(int x,int len) {
    vis[x] = 1;
    if(len > mx_len) mx_len = len,rt = x;
    for(int i = h[x];i != -1;i = ne[i]) {
        int j = e[i];
        if(!vis[j]) dfs(j,len + 1);
    }
}
int main() {
    int n;
    cin >> n ;
    memset(h,-1,sizeof h);
    for(int i = 0;i < n - 1; ++i) {
        int a,b;
        cin >> a >> b;
        add(a,b);
        add(b,a);
    }
    dfs(1,0);// 随机从一个点出发,目前长度为0
    memset(vis,0,sizeof vis);// 清空原先标记的vis
    dfs(rt,0);// 从直径的一端出发,去寻找另一端直径
    cout << mx_len;// 输出直径的长度
    return 0;
}

树的直径

标签:lan   pre   bool   ons   mes   clu   using   class   turn   

原文地址:https://www.cnblogs.com/lukelmouse/p/13160672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!