2023每日刷题(五十三)
Leetcode—2646.最小化旅行的价格总和
算法思想
看灵神的
实现代码
class Solution {
public:
int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector<int>>& trips) {
vector<int> g[n];
for(auto e: edges) {
int start = e[0], end = e[1];
g[start].emplace_back(end);
g[end].emplace_back(start);
}
vector<int> cnt(n);
for(auto t: trips) {
int end = t[1];
function<bool(int, int)> dfs = [&](int x, int fa) {
if(x == end) {
cnt[x]++;
return true;
}
for(auto y: g[x]) {
if(y != fa && dfs(y, x)) {
cnt[x]++;
return true;
}
}
return false;
};
dfs(t[0], -1);
}
function<pair<int, int>(int, int)> dfs2 = [&](int x, int fa) -> pair<int, int> {
int not_half = price[x] * cnt[x];
int half = not_half / 2;
for(auto y: g[x]) {
if(y != fa) {
auto [nh, h] = dfs2(y, x);
// x点不变, y可变可不变
not_half += min(nh, h);
// x点减半, y不变
half += nh;
}
}
return {not_half, half};
};
auto [nh, h] = dfs2(0, -1);
return min(nh, h);
}
};
运行结果
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!