本文共 1017 字,大约阅读时间需要 3 分钟。
新建一棵树,边权等于原树中(u, v)的唯一路径距离,目标是最大化新树的总成本。
首先,确定原树的直径。直径是指树中延伸最远的简单路径。寻找直径的两个端点可以使用三次DFS:
接下来,计算直径端点到其它所有节点的距离之和,即为新树的最大成本。
最佳做法是三次DFS:
#include#include using namespace std;vector > G[maxn];vector visited;ll dist = -1e18;int point;ll res[maxn];void dfs(int x, bool update, int index) { if (update) { if (G[x].size() > dist) dist = G[x].size(); point = x; } for (int v : G[x]) { if (!visited[v]) { visited[v] = true; if (!update) res[index][v] = res[index][x] + G[x][v]; else if (dist <= res[index][x] + G[x][v]) { res[index][v] = res[index][x] + G[x][v]; dist = res[index][v]; } dfs(v, update, index); } }}
需要注意的是,优化代码时应保留所有必要的变量和结构,确保程序正确工作。完成三次DFS后,点point即为终点,dist记录原树的直径长度。
最终,计算步骤即为从两个端点出发的总距离和,得到为新树的最大成本。
转载地址:http://pzfmz.baihongyu.com/