CF1822F Gardening Friends
题解
知识点:树的直径,枚举。
考虑一个结论:树上任意点的最远点一定是树的直径的端点。
那么对于一个根节点,只要知道了树的直径,那么我们就可以立即得到最远距离,即乘 树的价值。
接下来,我们只需要枚举每个点作为根节点时树的价值,减去 转移到这个点的距离乘 即可。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<int> g[200007]; void dfs(int u, int fa, vector<int> &dis) { for (auto v : g[u]) { if (v == fa) continue; dis[v] = dis[u] + 1; dfs(v, u, dis); } } bool solve() { int n, k, c; cin >> n >> k >> c; for (int i = 1;i <= n;i++) g[i].clear(); for (int i = 1;i <= n - 1;i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } vector<int> dis1(n + 1); dfs(1, 0, dis1); int A = max_element(dis1.begin() + 1, dis1.end()) - dis1.begin(); vector<int> disA(n + 1); dfs(A, 0, disA); int B = max_element(disA.begin() + 1, disA.end()) - disA.begin(); vector<int> disB(n + 1); dfs(B, 0, disB); ll ans = 0; for (int i = 1;i <= n;i++) ans = max(ans, 1LL * max(disA[i], disB[i]) * k - 1LL * dis1[i] * c); cout << ans << '\n'; return true; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t = 1; cin >> t; while (t--) { if (!solve()) cout << -1 << '\n'; } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/17686708.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧