/**
* struct Interval {
* int start;
* int end;
* Interval(int s, int e) : start(start), end(e) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 树的直径
* @param n int整型 树的节点个数
* @param Tree_edge Interval类vector 树的边
* @param Edge_value int整型vector 边的权值
* @return int整型
*/
int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {
// write code here
if (n <= 1) return 0;
vector<vector<pair<int, int>>> g(n);
for (int i = 0; i < Tree_edge.size(); ++i) {
int u = Tree_edge[i].start, v = Tree_edge[i].end, w = Edge_value[i];
g[u].push_back({v, w});
g[v].push_back({u, w});
}
auto far = [&](int s) {
vector<long long> d(n, -1);
queue<int> q;
q.push(s);
d[s] = 0;
int u = s;
while (!q.empty()) {
u = q.front();
q.pop();
for (auto& e : g[u]) if (d[e.first] == -1) {
d[e.first] = d[u] + e.second;
q.push(e.first);
}
}
int id = s;
long long mx = 0;
for (int i = 0; i < n; ++i) if (d[i] > mx) mx = d[i], id = i;
return pair<int, long long>(id, mx);
};
auto a = far(0); // 任选一点
auto b = far(a.first); // 到最远点的最远距离即直径
return b.second;
}
};