赞
踩
问题描述
小蓝和小桥是两位花园爱好者,她们在自己的花园里种了一棵n个节点的树,每条边的长度为k。初始时,根节点为1号节点。她们想把这棵树卖掉,但是想卖个好价钱。树的价值被定义为根节点到所有节点的路径长度的最大值。
为了让这棵树更有价值,小蓝和小桥可以对这棵树进行一种操作:花费c的代价,将根节点从当前的节点移动到它的一个相邻节点上。注意,这个操作不会改变树的形态,只是改变了根节点的位置。
她们希望通过尽可能地进行操作,使得卖出去的这棵树的盈利最大。盈利被定义为卖出去的树的价值减去操作的总代价。
请你帮助她们,找出她们能够获得的最大盈利。
输入格式
第一行包含一个整数t,表示测试数据组数。
每组数据第一行包含三个整数n、k和c,表示树的节点数、每条边的长度和进行一次移动操作的代价。
接下来n-1行,每行描述树的一条边,包含两个整数ui和vi,表示树中连接ui和vi之间的一条边。
输出格式
对于每组数据,输出一个整数,表示最大盈利。
样例输入
4
32
2
3
21
31
541
21
42
54
34
653
41
61
26
51
32
1064
13
19
97
76
64
92
28
85
510
样例输出
2
12
17
32
这个问题是关于在一棵树上进行操作以最大化盈利的问题。关键信息如下:
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
-
- const int MAXN = 100005;
- vector<int> g[MAXN];
- int maxDepth, farthestNode;
- long long maxProfit;
-
- void dfs(int u, int p, int depth, long long k, long long c) {
- if (depth > maxDepth) {
- maxDepth = depth;
- farthestNode = u;
- }
- for (int v : g[u]) {
- if (v != p) {
- dfs(v, u, depth + 1, k, c);
- }
- }
- }
-
- void solve(int n, long long k, long long c) {
- maxDepth = -1;
- dfs(1, 0, 0, k, c);
- maxProfit = max(0LL, k * maxDepth - c * (maxDepth - 1));
- }
-
- int main() {
- int t;
- cin >> t;
- while (t--) {
- int n;
- long long k, c;
- cin >> n >> k >> c;
- for (int i = 1; i <= n; ++i) g[i].clear();
- for (int i = 1; i < n; ++i) {
- int u, v;
- cin >> u >> v;
- g[u].push_back(v);
- g[v].push_back(u);
- }
- solve(n, k, c);
- cout << maxProfit << endl;
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。