zoukankan      html  css  js  c++  java
  • 树的直径

    两次(DFS)

    (O(n))

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

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

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int e[N*2],ne[N*2],w[N*2],idx,pos,d[N],h[N],ans;
    void add(int a,int b,int c) {
        e[idx] = b;
        w[idx] = c;
        ne[idx] = h[a];
        h[a] = idx ++;
    }
    void dfs(int u,int fa) {
        if(d[u] > ans) ans = d[u],pos = u;
        for(int i = h[u]; ~i;i = ne[i]) {
            int j = e[i];
            if(j == fa) continue;// 因为是无向边存储,会遍历到父亲节点,去掉即可
            d[j] = d[u] + w[i];// w[i] 代表 fa-> j 的边权 ,d[j] 就是 节点 j 的深度
            dfs(j,u);
        }
    }
    void find(int x) {
        ans = 0;
        d[x] = 0;
        dfs(x,0);
    }
    int main() {
        int n;
        memset(h,-1,sizeof h);
        cin >> n;
        for(int i = 0;i < n - 1; ++i) {
            int a,b;
            cin >> a >> b;
            add(a,b,1);
            add(b,a,1);
        }
        find(1);// 第一次寻找直径的端点
        find(pos);// 第二次寻找直径的另一端
        cout << ans;
        return 0;
    }
    

    模板题
    SP1437 PT07Z - Longest path in a tree

  • 相关阅读:
    Debug和Release区别
    C语言程序_管理系统
    读书的学问
    御姐的含义
    进制的英文书写
    CHM文件无法打开的解决方法
    819代码
    点击链接不跳转或刷新
    MS SqlServer 随机查询并随机排序
    Html背景图
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/13160672.html
Copyright © 2011-2022 走看看