wls的資料結構-樹
阿新 • • 發佈:2022-04-01
樹的直徑:最長的一條路徑
樹的中心:一條樹的直徑的中心點
樹的中心的性質:是到所有到其他點路徑最長的最小值,也就是直徑的一半上取整
並且樹的中心是唯一確定的(樹的直徑的長度是偶數的話唯二)
// 求樹的直徑 #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; }