/** * struct Interval { * int start; * int end; * Interval(int s, int e) : start(start), end(e) {} * }; */ #include <climits> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 树的直径 * @param n int整型 树的节点个数 * @param Tree_edge Interval类vector 树的边 * @param Edge_value int整型vector 边的权值 * @return int整型 */ //深度优先搜索,返回最大距离和远点end pair<int, int> dfs(int start, int father, vector< vector<pair<int, int> >>& mp){ pair<int, int> res = {0, start}; //初始化,没有考虑下一个节点时,距离,目的节点 for(auto elem:mp[start]){ //遍历下一个节点 if(elem.first == father){ continue; //跳过父节点 } auto temp = dfs(elem.first, start, mp); //和Djstra算法是一样的 int distance = temp.first + elem.second; //从start到经过下一个节点的最远距离 if(distance > res.first){ res = make_pair(distance, temp.second); } } return res; } int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) { vector< vector<pair<int, int> >> mp(n, vector<pair<int, int>>(0)); //下标是开始节点,里面的pair是目的节点以及其距离 int index = 0; for (auto struc : Tree_edge) { mp[struc.start].push_back( make_pair(struc.end, Edge_value[index]) ); //构造邻接表,以及其距离 mp[struc.end].push_back( make_pair(struc.start, Edge_value[index])); //树的边是无向的两边都连通,在邻接表中记录的是节点到下一个,有向的,则需要记录双向 index++; } //深度优先搜索,返回最大距离和远点end auto one = dfs(Tree_edge.front().start, INT_MIN, mp); //一次搜索到一个直径的端点 auto another_one = dfs(one.second, INT_MIN, mp); return another_one.first; } };