传送门

题目大意:

一棵无根树,每条边有一个距离,求每个顶点到距离其最远的顶点的距离。

思路:

考虑树形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. 计算机的更多相关文章

  1. [Z] 计算机类会议期刊根据引用数排名

    一位cornell的教授做的计算机类期刊会议依据Microsoft Research引用数的排名 link:http://www.cs.cornell.edu/andru/csconf.html Th ...

  2. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

  3. Acwing 883高斯消元法的运用

    Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...

  4. 计算机电子书 2018 BiliDrive 备份

    下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 Webpack 中文指南.epub (40 ...

  5. (acwing蓝桥杯c++AB组)1.1 递归

    (acwing蓝桥杯c++AB组)1.课程介绍+递归 文章目录 (acwing蓝桥杯c++AB组)1.课程介绍+递归 课程介绍 第一讲 递归与递推 递归 引入 递归的底层调用顺序 例题与练习 课程介绍 ...

  6. 计算机保研,maybe this is all you need(普通双非学子上岸浙大工程师数据科学项目)

    写在前面 9.28接收了拟录取通知,也终究是尘埃落定了,我人生的又一个阶段也终于结束.面对最终录取结果,或多或少会有所遗憾,但也还是基本达到了预期的目标了. 作为在今年严峻的保研形势下幸存的我,一直想 ...

  7. Web前端需要熟悉大学里【高大上】的计算机专业课吗?

    作为一名刚刚大学毕业,进入新的学习阶段的研究生,我必须说大学的专业课非常重要!不管你信不信,事实就是如此! 一.大学学习的专业课非常重要,它决定了我们能走到什么高度 前端的发展非常快,我常常觉得刚刚关 ...

  8. 计算机人物系列-Mauchly,Eckert,Goldstine

    关键词:莫尔学院(Moore School),阿伯丁试验场(Aberdeen Proving Ground), 雷明顿兰德公司(Remington Rand Corporation), IBM院士(I ...

  9. 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标

    我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...

随机推荐

  1. 使用ansible 批量分发ssh密钥

    先看执行结果 看看ssh.yml怎么写的 看看hosts文件中backup组怎么写的

  2. linux如何复制文件

    目录 一:复制文件 二:文件详细属性 一:复制文件 copy的缩写cp. 格式: cp [参数] [被复制文件的路径] [复制到的新路径] 参数: -r : 递归复制 -a : 保证某些属性不变 案列 ...

  3. python类和函数

    #/usr/bin/python #coding=utf-8 class Car(): def __init__(self,name,year): self.name = name self.year ...

  4. iBooker 财务提升星球 2020.2~3 热门讨论

    前两天分享了一下关于我们个人的现金流,今天就以公司的角度去分- 我们技术人,如何开源增加我们的收入? 首先,我们对收入进行下- 热门股要不要买? 参考标准: 1. 时机 2. 泡沫 时- #老实人报# ...

  5. CentOS7安装部署Prometheus+Grafana (转)

    转自:https://www.jianshu.com/p/967cb76cd5ca 作为监控系统的后起之秀,prometheus的安装可谓非常简单,不需要第三方的依赖(数据库.缓存.PHP之类的).下 ...

  6. iOS9新特性之常见关键字

    /* nullable:1.怎么使用(语法) 2.什么时候使用(作用) nullable作用:可能为空 nullable 语法1 @property (nonatomic, strong, nulla ...

  7. curl: (6) Could not resolve host: mirrors.163.com; Unknown error 服务器上解析不了域名,换成ip可以

    原因是DNS域名解析问题: 添加nameserver即可解决 echo nameserver 8.8.8.8 > /etc/resolv.conf 解释一下DNS服务 DNS(Domain Na ...

  8. 自定义的类实现copy操作

    1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...

  9. Spring与Struts2整合时action自动注入的问题

    当Struts和Spring框架进行整合时,原本由action实例化对象的过程移交给spring来做(这个过程依赖一个叫struts2-spring-plugin的jar包,这个包主要的功能就是实现刚 ...

  10. 泛型、Junit

    一. 泛型 1.泛型的好处 **1)编译时,检查添加元素的类型,提高了安全2)减少了类西较换的次数,提高效率 不使用泛型Dog -> Object -> Dog //放入到ArrayLis ...