树的直径

树的直径解释:

表示的是树的最长的路径

求法:

任意位置开始寻找一个最远距离的点,那么这个点就是直径的一端,然后从一端开始寻找另外一个点

经典例题:

https://www.lanqiao.cn/problems/5890/learning/?contest_id=145

  • 注意:
    我们需要注意的是这里的距离是可以超过int的范围的,所以使用 long long
  • 代码:
    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 2e5 + 10;
    typedef pair<int, int> pei;
    typedef long long ll;
    
    
    int n;
    ll sum;
    //邻接矩阵
    vector<pei> grid[MAXN];
    int node;//表示端点
    ll dis;
    int used[MAXN];
    
    void dfs(int cur, ll len) {
        if(len > dis) {
            node = cur;
            dis = len;
        }
        for(auto it : grid[cur]) {
            int i = it.first, wi = it.second;
            if(used[i]) {
                continue;
            }
            used[i] = true;
            len += wi;
            dfs(i, len);
            len -= wi;
            used[i] = false;
        }
    }
      
    
    
    
    int main() {
        cin >> n;
        for(int i = 0; i < n - 1; i++) {
            int a, b, c;
            cin >> a >> b >> c;
            grid[a].push_back({b, c});
            grid[b].push_back({a, c});
            sum += 2*c;
        }
        // for(int i = 1; i <= n; i++) {
        //     cout << i << ":" << endl;
        //     for(int j = 0; j < grid[i].size(); j++) {
        //         cout << grid[i][j].first << " ";
        //     }
        //     cout << endl;
        // }
        //寻找一个端点
        memset(used, 0, sizeof(used));
        dis = 0;
        used[1] = true;
        dfs(1, 0) ;
        //寻找另外一个端点
        memset(used, 0, sizeof(used));
        dis = 0;
        used[node] = true;
        dfs(node, 0);
    
        cout << sum - dis;
        return 0;
    }
    
posted @ 2023-10-27 19:47  铜锣湾陈昊男  阅读(9)  评论(0)    收藏  举报