/** * struct Interval { * int start; * int end; * Interval(int s, int e) : start(start), end(e) {} * }; */ // 求树的直径,一次 dfs 即可,每次记录最大值、次大值,即以当前节点为中间点的最长直径,每次维护 res 即可 const int N = 200010; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 树的直径 * @param n int整型 树的节点个数 * @param Tree_edge Interval类vector 树的边 * @param Edge_value int整型vector 边的权值 * @return int整型 */ int e[N], ne[N], h[N], w[N], idx = 0; int res = 0; void add(int a, int b, int c) { w[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx ++; } int dfs(int u, int fa) { int Max = 0, Maxx = 0; for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (j == fa) continue; int x = dfs(j, u) + w[i]; if (x > Max) { Maxx = Max; Max = x; } else if (x >= Maxx) Maxx = x; } res = max(res, Maxx + Max); return Max; } int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) { // write code here memset(h, -1, sizeof h); for (int i = 0; i + 1 < n; i ++) { add(Tree_edge[i].start, Tree_edge[i].end, Edge_value[i]); add(Tree_edge[i].end, Tree_edge[i].start, Edge_value[i]); } dfs(1, -1); return res; } };