Untitled

 avatar
unknown
plain_text
22 days ago
2.0 kB
4
Indexable
class Solution {
public:
    struct Node {
        int val,wt;
    };
    pair<int,int> dfs(Node i, vector<vector<Node>> &tree, vector<int>& nums, unordered_set<int> &st, vector<int> &vis) {
        int n=tree[i.val].size();
        if(vis[i.val]==1)return {0,0};
        vis[i.val]=1;
        if(st.find(nums[i.val])!=st.end()){
            vis[i.val]=0;
            return {0,0};
        }
        if(n==0)return {i.wt,1};
        st.insert(nums[i.val]);
        int maxLen=INT_MIN, minNode=INT_MAX;
        for(int j=0;j<tree[i.val].size();j++){
            pair<int,int> x=dfs(tree[i.val][j],tree,nums,st,vis);
            if(x.first==maxLen&&x.second<minNode){
                minNode=x.second;
            }
            else if(x.first>maxLen){
                maxLen=x.first;;
                minNode=x.second;
            }
        }
        pair<int,int> ans={i.wt+maxLen,1+minNode};
        st.erase(nums[i.val]);
        vis[i.val]=0;
        return ans;
    }
    vector<int> longestSpecialPath(vector<vector<int>>& edges, vector<int>& nums) {
        int n=nums.size();
        vector<vector<Node>> tree(n);
        for(int i=0;i<edges.size();i++){
            tree[edges[i][0]].push_back({edges[i][1],edges[i][2]});
            tree[edges[i][1]].push_back({edges[i][0],edges[i][2]});
        }
        vector<Node> leafs;
        for(int i=0;i<n;i++){
            if(tree[i].size()==1)leafs.push_back({i,0});
        }
        unordered_set<int> st;
        vector<int> vis(n,0);
        int maxLen=INT_MIN, minNode=INT_MAX;
        for(int i=0;i<leafs.size();i++){
            pair<int,int> x=dfs(leafs[i],tree,nums,st,vis);
            if(x.first==maxLen&&x.second<minNode){
                minNode=x.second;
            }
            else if(x.first>maxLen){
                maxLen=x.first;;
                minNode=x.second;
            }
        }
        return {maxLen,minNode};
    }
};
Editor is loading...
Leave a Comment