diff --git a/test99-5-2.cpp b/test99-5-2.cpp new file mode 100644 index 0000000..d926c33 --- /dev/null +++ b/test99-5-2.cpp @@ -0,0 +1,52 @@ +// lanqiao3029 卖树 +#include +using namespace std; +using ll = long long; +const int N = 1e5 + 9; +vector g[N]; +int dep1[N], depU[N], depV[N]; +void dfs(int x, int fa, int dep[]){ + dep[x] = dep[fa] + 1; + for(const auto &y:g[x]){ + if(y == fa) continue; + dfs(y, x, dep); + } +} +void solve(){ + ll n, k, c; cin >> n >> k >> c; + for(int i = 1; i < n; i++){ + int u, v; cin >> u >> v; + g[u].push_back(v), g[v].push_back(u); + } + dep1[0] = depU[0] = depV[0] = -1; + dfs(1, 0, dep1); + // 得到U + int U = 1; + for(int i = 1; i <= n; i++) if(dep1[i] > dep1[U]) U = i; + dfs(U, 0, depU); + int V = 1; + for(int i = 1; i <= n; i++) if(depU[i] > depU[V]) V = i; + dfs(V, 0, depV); + // 枚举所有点计算价值和代价 + ll ans = 0; + for(int i = 1; i <= n; i++){ + // 价值 = 以 i 为根的树的所有点的最大深度, 即max(depU[i], depV[i]) + // 代价 = 从1走到i的代价 + ans = max(ans, max(depU[i], depV[i])*k - dep1[i]*c); + } + cout << ans << endl; + + // 多组测试数据,需要重置 + for(int i = 1; i <= n; i++) g[i].clear(); +} +int main(){ + int t; cin >> t; + while(t--) solve(); + return 0; +} +/* test samples -> 4 +1 +3 4 5 +1 2 +1 3 +*/ \ No newline at end of file