树的直径
树的直径解释:
表示的是树的最长的路径
求法:
任意位置开始寻找一个最远距离的点,那么这个点就是直径的一端,然后从一端开始寻找另外一个点
经典例题:
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; }

浙公网安备 33010602011771号