Untitled
unknown
plain_text
9 months ago
2.0 kB
6
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