1. 程式人生 > 其它 >wls的資料結構-樹

wls的資料結構-樹

樹的直徑:最長的一條路徑
樹的中心:一條樹的直徑的中心點
樹的中心的性質:是到所有到其他點路徑最長的最小值,也就是直徑的一半上取整
並且樹的中心是唯一確定的(樹的直徑的長度是偶數的話唯二)
// 求樹的直徑
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N = 1e5+10;
vector<int> sons[N];
int dist[N];

void dfs1(int u, int fa){
    for(auto son : sons[u]){
        if(son == fa) continue;
        dist[son] = dist[u] + 1;
        dfs1(son, u);
    }
}

int main(){
    int n; scanf("%d", &n);
    for(int i = 1; i <= n - 1; i ++){
        int x, y; scanf("%d %d", &x, &y);
        sons[x].push_back(y);
        sons[y].push_back(x);
    }

    dfs1(1, -1);

    int lenmaxn = 0, lenid = 0;
    for(int i = 1; i <= n; i ++){
        if(dist[i] > lenmaxn) lenmaxn = dist[i], lenid = i;
    }
    dist[lenid] = 0;
    dfs1(lenid, -1);
    lenmaxn = 0, lenid = 0;
    for(int i = 1; i <= n; i ++){
        if(dist[i] > lenmaxn) lenmaxn = dist[i], lenid = i;
    }
    cout << lenmaxn << endl;
    return 0;
}