/**
 * 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;
    }
};