/** * struct Interval { * int start; * int end; * Interval(int s, int e) : start(start), end(e) {} * }; */ class Solution { private: vector<vector<pair<int, int>>> graph; // 邻接表表示,pair<节点, 边权> vector<bool> visited; int maxDist; int farthestNode; // DFS函数,用于遍历并找出最远距离 void dfs(int node, int dist) { visited[node] = true; if (dist > maxDist) { maxDist = dist; farthestNode = node; } for (auto& edge : graph[node]) { if (!visited[edge.first]) { dfs(edge.first, dist + edge.second); } } } 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 // 检查输入是不是有问题 // 以输入的第二部分为基准, // 第一部分的数字大或者小不影响,第二部分有 n 对点对,在一棵树里节点数就是 n + 1。 // 第三部分多或者少也同样不影响,少了我们补 0,多了就不读入多余那部分就好了。 n = Tree_edge.size() + 1; // 节点数应为边数+1 if (Edge_value.size() < Tree_edge.size()) { Edge_value.resize(Tree_edge.size(), 0); // 边权不足时补0 } // 处理完输入之后再建图 graph.resize(n); visited.resize(n, false); for (int i = 0; i < Tree_edge.size(); i++) { int u = Tree_edge[i].start; int v = Tree_edge[i].end; int weight = Edge_value[i]; graph[u].push_back({v, weight}); graph[v].push_back({u, weight}); } // 第一次DFS找到最远的节点 maxDist = 0; dfs(0, 0); // 第二次DFS从最远的节点开始 fill(visited.begin(), visited.end(), false); maxDist = 0; dfs(farthestNode, 0); return maxDist; } };