NC52867 Highway
题目
题目描述
In ICPCCamp there were n towns conveniently numbered with \(1, 2, \dots, n\)
connected with (n - 1) roads.
The i-th road connecting towns aia_iai and bib_ibi has length \(c_i\) .
It is guaranteed that any two cities reach each other using only roads.
Bobo would like to build (n - 1) highways so that any two towns reach each using only highways.
Building a highway between towns x and y costs him \(\delta(x, y)\) cents,
where \(\delta(x, y)\) is the length of the shortest path between towns x and y using roads.
As Bobo is rich, he would like to find the most expensive way to build the (n - 1) highways.
输入描述
The input contains zero or more test cases and is terminated by end-of-file. For each test case:
The first line contains an integer n.
The i-th of the following (n - 1) lines contains three integers aia_iai, bib_ibi and cic_ici.
- \(1 \leq n \leq 10^5\)
- \(1 \leq a_i, b_i \leq n\)
- \(1 \leq c_i \leq 10^8\)
- The number of test cases does not exceed 10.
输出描述
For each test case, output an integer which denotes the result.
示例1
输入
5
1 2 2
1 3 1
2 4 2
3 5 1
5
1 2 2
1 4 1
3 4 1
4 5 2
输出
19
15
题解
知识点:DFS,树的直径。
重修 \(n-1\) 条路,使得花费和最大,每条路的花费是两端原先的最短路。
容易证明,只要以树的直径两端为道路的一端连接其他点,即可最大化花费。因此,先通过两次dfs找到树的直径端点,然后遍历每个点取距离最远的一端即可。
时间复杂度 \(O(n+m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
template<class T>
struct Graph {
struct edge {
int v, nxt;
T w;
};
int idx;
vector<int> h;
vector<edge> e;
Graph(int n, int m) :idx(0), h(n + 1), e(m + 1) {}
void clear(int n, int m) {
idx = 0;
h.assign(n + 1, 0);
e.assign(m + 1, { 0,0,0 });
}
void add(int u, int v, T w) {
e[++idx] = edge{ v,h[u],w };
h[u] = idx;
}
};
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
while (cin >> n) {
Graph<int> g(n, n << 1);
for (int i = 2;i <= n;i++) {
int u, v, w;
cin >> u >> v >> w;
g.add(u, v, w);
g.add(v, u, w);
}
function<void(int, int, vector<ll> &)> dfs = [&](int u, int fa, vector<ll> &dis) {
for (int i = g.h[u];i;i = g.e[i].nxt) {
int v = g.e[i].v, w = g.e[i].w;
if (v == fa) continue;
dis[v] = dis[u] + w;
dfs(v, u, dis);
}
};
vector<ll> dis(n + 1);
dfs(1, 0, dis);
int pos1 = 0;
for (int i = 1;i <= n;i++)
if (dis[i] > dis[pos1]) pos1 = i;
vector<ll> dis1(n + 1);
dfs(pos1, 0, dis1);
int pos2 = 0;
for (int i = 1;i <= n;i++)
if (dis1[i] > dis1[pos2]) pos2 = i;
vector<ll> dis2(n + 1);
dfs(pos2, 0, dis2);
ll ans = dis1[pos2];
for (int i = 1;i <= n;i++) {
if (i == pos1 || i == pos2) continue;
ans += max(dis1[i], dis2[i]);
}
cout << ans << '\n';
}
return 0;
}
NC52867 Highway的更多相关文章
- zoj 3946 Highway Project(最短路 + 优先队列)
Highway Project Time Limit: 2 Seconds Memory Limit: 65536 KB Edward, the emperor of the Marjar ...
- [HihoCoder] Highway 高速公路问题
Description In the city, there is a one-way straight highway starts from the northern end, traverses ...
- Total Highway Distance
Total Highway Distance 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a ...
- 基于pytorch实现HighWay Networks之Train Deep Networks
(一)Highway Networks 与 Deep Networks 的关系 理论实践表明神经网络的深度是至关重要的,深层神经网络在很多方面都已经取得了很好的效果,例如,在1000-class Im ...
- Highway Networks
一 .Highway Networks 与 Deep Networks 的关系 深层神经网络相比于浅层神经网络具有更好的效果,在很多方面都已经取得了很好的效果,特别是在图像处理方面已经取得了很大的突破 ...
- Highway Networks Pytorch
导读 本文讨论了深层神经网络训练困难的原因以及如何使用Highway Networks去解决深层神经网络训练的困难,并且在pytorch上实现了Highway Networks. 一 .Highway ...
- Highway LSTM 学习笔记
Highway LSTM 学习笔记 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2016-4-5 声明 1)该Dee ...
- ZOJ3946:Highway Project(最短路变形)
本文转载自:http://www.javaxxz.com/thread-359442-1-1.html Edward, the emperor of the Marjar Empire, wants ...
- 基于pytorch实现HighWay Networks之Highway Networks详解
(一)简述---承接上文---基于pytorch实现HighWay Networks之Train Deep Networks 上文已经介绍过Highway Netwotrks提出的目的就是解决深层神经 ...
- TZOJ 3481 Highway Construction(树的直径+最短路)
描述 As head of the Accessible Commuting Movement (ACM), you've been lobbying the mayor to build a new ...
随机推荐
- TICK 中Kapacitor功能和使用说明
转载请注明出处: 1.Kapacitor 简介 Kapacitor是InfluxData公司开发的一个实时流数据处理引擎.它可以实时地通过TICK脚本处理InfluxDB中的流数据以及批处理数据. K ...
- spring启动流程 (6完结) springmvc启动流程
SpringMVC的启动入口在SpringServletContainerInitializer类,它是ServletContainerInitializer实现类(Servlet3.0新特性).在实 ...
- SQL—排序专用窗口函数
下面介绍三种用于进行排序的专用窗口函数: 1.RANK() 在计算排序时,若存在相同位次,会跳过之后的位次. 例如,有3条排在第1位时,排序为:1,1,1,4······ 2.DENS ...
- golang将字符串进行md5加密
最近写项目要把登录密码进行md5加密保存,在golang里面的写法略有不同,再次记录一下. package main import ( "crypto/md5" "enc ...
- 【SI】source insight4 添加指定类型的文件
Options->File Type Options 红框可选择是否将指定类型的文件添加到工程 绿框可添加自定义文件类型,如汇编*.s;*.S 蓝框可新增文件类别,用于自定义文件类型 如不需将t ...
- [转帖]K8s Pod Command 与容器镜像 Cmd 启动优先级详解
https://cloud.tencent.com/developer/article/1638844 前言 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数.如果要设置命令,就填写在 ...
- [转帖]从小白到精通:揭秘perf工具的全部功能与操作技巧
https://zhuanlan.zhihu.com/p/664396453 目录 收起 一.引言 二.理解perf工具的基本概念 三.安装与配置perf工具 3.1.不同操作系统的perf工具安 ...
- [转帖]Shell三剑客之awk
目录 awk简述 awk的工作过程 awk的工作原理 awk的基本格式及其内置变量 getline 文本内容匹配过滤打印 对字段进行处理打印 条件判断打印 awk的三元表达式与精准筛选用法 awk的精 ...
- [转帖]TiDB Control 使用说明
https://docs.pingcap.com/zh/tidb/stable/tidb-control TiDB Control 是 TiDB 的命令行工具,用于获取 TiDB 状态信息,多用于调试 ...
- megacli_sw服务器Raid卡的设置过程
megacli_sw服务器的设置过程 背景 采购的申威服务器有四块硬盘, 第一台服务器在sdd上面安装了一个银河麒麟v10的系统 sda,sdb,sdc 三块硬盘没有进行raid设置, 直接还是用的J ...