二叉树最大路径和
class Solution {
int maxSum = INT_MIN;
public:
int getAns(TreeNode *root){
if(root == nullptr) return 0;
int left = max(getAns(root->left),0);
int right = max(getAns(root->right),0);
int lmr = root->val + left + right;
maxSum = max(maxSum,lmr);
return root->val + max(left,right);
}
int maxPathSum(TreeNode* root) {
getAns(root);
return maxSum;
}
};
去掉一个端点的最大路径和
class Solution {
public:
long long maxOutput(int n, vector<vector<int>>& edges, vector<int>& price) {
vector<vector<int>> g(n);
for(auto &e:edges){
g[e[0]].push_back(e[1]);
g[e[1]].push_back(e[0]);
}
long long ans = 0;
function<pair<long long, long long>(int, int)> dfs = [&](int x,int fa)->pair<long long, long long>{
long long val = price[x],max_with = val,max_no = 0;
for(auto &y:g[x]){
if(y == fa)continue;
auto [s_with,s_no] = dfs(y,x);
ans = max({ans,s_with + max_no,s_no + max_with});
max_with = max(max_with,s_with + val);
max_no = max(max_no,s_no + val);
}
return {max_with,max_no};
};
dfs(0,-1);
return ans;
}
};