AcWing 325. 计算机
题目大意:
一棵无根树,每条边有一个距离,求每个顶点到距离其最远的顶点的距离。
思路:
考虑树形DP+换根。
令D[x]x到以x为根的子树当中的最长距离,d[x]为次长距离,U[x]为x向上走的最长距离,F[x]为x的答案。
第一次dfs以1为根可以很容易求出D[x]与d[x]。
之后第二次dfs对每个顶点去求最终的答案。
令p为父节点,v为当前节点,l为p到v的距离,于是有
F[x]=max(D[x],U[x])
对于D[p] == D[v] + l的情况,说明p向下的最长距离可以从v经过,那么就应该从父节点的向下次长距离,向上的最长距离的最大值+p到v之间的距离中选择一个作为U[x],即U[x]=max(d[p],U[p])+l。
否则,直接就可以考虑父节点向下走的最大值,于是U[x]=max(D[p],U[p])+l
最后每个节点的答案即为F[x]。
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef long long LL;
//#define int LL
#pragma warning(disable :4996)
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const int maxn = 10010;
const long double eps = 1e-8;
const LL MOD = 998244353;
struct Edge {
int to, len;
};
int N;
int root = 1;
int F[maxn], D[maxn], d[maxn], U[maxn];//D[x]x到以x为根的子树当中的最长距离,d[x]次长距离,U[x]x向上走的最长距离,F[x]x的答案。
vector<Edge>G[maxn];
bool used[maxn];
void add_edge(int from, int to, int len)
{
G[from].push_back(Edge{ to,len });
G[to].push_back(Edge{ from,len });
}
void dfs1(int v)
{
d[v] = D[v] = 0;
used[v] = true;
for (int i = 0; i < G[v].size(); i++)
{
Edge& e = G[v][i];
if (!used[e.to])
{
dfs1(e.to);
int val = D[e.to] + e.len;
if (val >= D[v])
{
d[v] = D[v];
D[v] = val;
}
else if (val > d[v])
d[v] = val;
}
}
}
void dfs2(int v, int p, int l)
{
used[v] = true;
if (D[p] == D[v] + l)//p的最长经过v
U[v] = l + max(d[p], U[p]);
else
U[v] = l + max(D[p], U[p]);
F[v] = max(U[v], D[v]);
for (int i = 0; i < G[v].size(); i++)
{
Edge& e = G[v][i];
if (!used[e.to])
dfs2(e.to, v, e.len);
}
}
void solve()
{
memset(used, 0, sizeof(used));
memset(D, 0, sizeof(D));
memset(d, 0, sizeof(d));
memset(F, 0, sizeof(F));
memset(U, 0, sizeof(U));
dfs1(root);
memset(used, 0, sizeof(used));
dfs2(root, 0, 0);
for (int i = 1; i <= N; i++)
cout << F[i] << endl;
}
int main()
{
IOS;
while (cin >> N)
{
for (int i = 0; i <= N; i++)
G[i].clear();
int v, len;
for (int i = 2; i <= N; i++)
{
cin >> v >> len;
add_edge(i, v, len);
}
solve();
}
return 0;
}
AcWing 325. 计算机的更多相关文章
- [Z] 计算机类会议期刊根据引用数排名
一位cornell的教授做的计算机类期刊会议依据Microsoft Research引用数的排名 link:http://www.cs.cornell.edu/andru/csconf.html Th ...
- 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归
(题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...
- Acwing 883高斯消元法的运用
Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...
- 计算机电子书 2018 BiliDrive 备份
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 Webpack 中文指南.epub (40 ...
- (acwing蓝桥杯c++AB组)1.1 递归
(acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...
- 计算机保研,maybe this is all you need(普通双非学子上岸浙大工程师数据科学项目)
写在前面 9.28接收了拟录取通知,也终究是尘埃落定了,我人生的又一个阶段也终于结束.面对最终录取结果,或多或少会有所遗憾,但也还是基本达到了预期的目标了. 作为在今年严峻的保研形势下幸存的我,一直想 ...
- Web前端需要熟悉大学里【高大上】的计算机专业课吗?
作为一名刚刚大学毕业,进入新的学习阶段的研究生,我必须说大学的专业课非常重要!不管你信不信,事实就是如此! 一.大学学习的专业课非常重要,它决定了我们能走到什么高度 前端的发展非常快,我常常觉得刚刚关 ...
- 计算机人物系列-Mauchly,Eckert,Goldstine
关键词:莫尔学院(Moore School),阿伯丁试验场(Aberdeen Proving Ground), 雷明顿兰德公司(Remington Rand Corporation), IBM院士(I ...
- 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标
我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...
随机推荐
- 新年好 takoyaki,期待再次与你相见
一.序 今天是中国农历一年的最后一天,往年都叫年三十,今年没有三十,最后一天是二十九.厨房的柴火味.窗外的鞭炮声还有不远处传来的说笑声,一切都是熟悉味道,新年到了,家乡热闹起来了.平常左邻右舍都是看不 ...
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.6
公告 我们的群共享文件有备份到 IPFS 的计划,具体时间待定. 我们的机器学习群(915394271)正式改名为财务提升群,望悉知. 请关注我们的公众号"ApacheCN",回复 ...
- Activity有多个启动图标
(1)如果你想让你的Activity有多个启动图标 需要这样配置 <intent-filter> <action android:name="android.intent. ...
- 利用babel将es6语法转es5的简单示例
前言 Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以现在就用ES6编写程序,而不用担心现有环境是否支持. 文件目录结构 生成包管理配置文件pa ...
- 自动归档autoArchive By H.l
写点简单的代码,让开发更简单 详情:ios 应用实现快速的临时缓存之模型的自动归档 Demo:https://files.cnblogs.com/files/sixindev/AutoArchiver ...
- mysql导出csv格式命令
mysql -h 127.0.0.1 -u user -p123456 -Bse "select name,age from user where age > 10;" | ...
- MySQL高质量博文链接集合
1. 『浅入浅出』MySQL 和 InnoDB https://draveness.me/mysql-innodb.html
- 一键部署lnmp
一键部署lnmp 提前将nginx .mysql .php 所需安装包都放在/opt目录下 脚本启动结束时,重启一下nginx 服务,就能在火狐浏览器更新出php测试页 脚本如下:(脚本里的软件 ...
- Spring Boot内置Tomcat
Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器.在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是 ...
- java-poi 批量导入excel数据
1,首先,前端发送MultipartFile类型文件,后端接收 2,分别创建多个ImportParams对象(easypoi),对应工作蒲 注意:pom中 要有相对应的配置 <!-- easyp ...