博客
关于我
2019牛客国庆集训派对day4H题
阅读量:653 次
发布时间:2019-03-15

本文共 995 字,大约阅读时间需要 3 分钟。

新建一棵树,边权等于原树中(u, v)的唯一路径距离,目标是最大化新树的总成本。

首先,确定原树的直径。直径是指树中延伸最远的简单路径。寻找直径的两个端点可以使用三次DFS:

  • 从任意节点出发,进行DFS,记录每个节点到起点的最远距离。
  • 在第一步中的最远节点作为起点,进行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/

    你可能感兴趣的文章
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中实现地图上打点并显示图标和文字
    查看>>
    Openlayers中实现地图上添加一条红色直线
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    OpenLayers使用点要素作为标记
    查看>>
    Openlayers入门教程 --- 万字长篇
    查看>>
    Openlayers各组件默认的css样式
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    VM16+ubuntu20.04+win10如何固定虚拟机的ip (固定IP)
    查看>>
    OpenLayers学习一:地图加载(以类为接口)
    查看>>
    OpenLayers学习三:地图旋转及地图跳转到某一点的方式(以类为接口)
    查看>>
    OpenLayers学习二:点标记的添加删除和修改(以类为接口)
    查看>>
    Openlayers实战教程学习大纲及引导
    查看>>
    Openlayers实战:drawstart,drawend 绘制交互应用示例
    查看>>
    Openlayers实战:extent介绍及实际应用
    查看>>
    Openlayers实战:LayerGroup添加删除显示隐藏
    查看>>