首页 > 编程语言 >《算法竞赛进阶指南》 第六章 325. 计算机

《算法竞赛进阶指南》 第六章 325. 计算机

时间:2024-10-11 10:44:01浏览次数:8  
标签:10 计算机 idx int 28 ne 325 第六章 进阶

/*
325. 计算机
https://www.acwing.com/problem/content/description/327/

一所学校前一段时间买了第一台计算机(所以这台计算机的 ID 是 1)。

近年来,学校又购买了 N−1台新计算机。

每台新计算机都与之前买进的计算机中的一台建立连接。

现在请你求出第 i台计算机到距离其最远的计算机的电缆长度。

例如,上图中距离计算机 1最远的是计算机 4,
因此 S1=3;距离计算机 2最远的是计算机 4 和 5,
因此 S2=2;距离计算机 3 最远的是计算机 5,所以 S3=3;
同理,我们也得到 S4=4,S5=4。

输入格式
输入包含多测试数据。

每组测试数据第一行包含整数 N。

接下来 N−1 行,每行包含两个整数,第 i 行的第一个整数表示第 i 台电脑买入时连接的电脑编号,
第二个整数表示这次连接花费的电缆长度。

输出格式
每组测试数据输出 N行。

第 i 行输出第 i台电脑的 Si。

数据范围
1≤N≤10000
,
电缆总长度不超过109

输入样例:
5
1 1
2 1
3 1
1 1
输出样例:
3
2
3
4
4



10
1 6
2 1
1 5
1 6
4 7
2 1
1 4
6 6
7 9
10
1 7
2 10
1 9
4 2
5 10
1 2
2 3
5 3
1 7


18
24
25
21
24
28
25
22
34
34
21
28
38
26
28
38
23
31
31
28
*/


#include <iostream>
#include <cstring>
using namespace std;

const int N = 10010;

int h[N], e[2 * N], ne[2 * N], w[2 * N], idx;
int n;
int f[N][2][2], v[N];

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void up(int u, int fa) {
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i]; int c = w[i];
		if (j == fa) continue;
		up(j, u);
		if (f[j][0][0] + c > f[u][0][0]) {
			f[u][1][0] = f[u][0][0]; f[u][1][1] = f[u][0][1];
			f[u][0][0] = f[j][0][0] + c; f[u][0][1] = j;
		}
		else if (f[j][0][0] + 1 > f[u][1][0]) {
			f[u][1][0] = f[j][0][0] + c; f[u][1][1] = j;
		}
	}
}



void down(int u, int fa) {
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i]; int c = w[i];
		if (j == fa) continue;
		if(f[u][0][1] == j)
			v[j] = max(v[u], f[u][1][0]) + c;
		else
			v[j] = max(v[u], f[u][0][0]) + c;

		down(j, u);
	}
}


int main()
{
	while (cin >> n) {
		memset(h, -1, sizeof h);
		memset(f, 0, sizeof f);
		memset(v, 0 , sizeof v);
		for (int i = 2; i <= n; i++) {
			int a, b; cin >> a >> b;
			add(i, a, b); add(a, i, b);
		}

		up(1, -1);
		down(1, -1);

		for (int i = 1; i <= n; i++) {
			cout << max(v[i], f[i][0][0]) << endl;
		}
	}
	
	return 0;
}

标签:10,计算机,idx,int,28,ne,325,第六章,进阶
From: https://www.cnblogs.com/itdef/p/18457947

相关文章

  • 设计方案:283-基于XILINX K7 XC7K325T的PCIe_CameraLink图像模拟源
    ​一、板卡概述       本图像模拟源板卡基于Xilinx公司的FPGAXC7K325T-2FFG900芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900。主要的功能是实现系统能够接收外部相机的噪声数据,经过图像转换板拟通过PCI-E接口输入到上位机。​编辑 二、功能和技术指标:    1、用于......
  • Python小白进阶篇之概率论
        今天我们的学习笔记到了概率论这一篇,相信各位对于概率都不会太陌生,在高中作为选择题和大题,大家与之接触的不算少,那么走近属于大学的概率,战友们也一举拿下!!!一、事件概率1.1事件事件是指在某个试验或观察中可能发生的结果或结果的集合。是样本空间的一个子集,可以包......
  • 面向对象进阶-认识多态
    2024-10-10,今天的课程比较多,改了很多线下的事情,今天先对多态进行了认识。什么是多态?同类型的对象,表现出的不同形态。多态的表现形式?父类类型对象的名称=new子类对象();fuf=newzi();多态的前提?1.有继承关系 2.有父类引用指向子类对象 3.有方法重写多态的好......
  • 昇思MindSpore进阶教程--自动数据增强
    大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。技术上主攻前端开发、鸿蒙开发和AI算法研究。努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧正文开始MindSpore除了可以让用户自定义数据增强的使用,还提供了一种自动数据增强方式,可以基于特定......
  • Vulkan进阶系列0 - Raytracing 基础
    一:概述    Vulkan的光线追踪是一种现代图形技术,用于实现更加逼真的高质量渲染效果。通过使用Vulkan的光线追踪扩展:VK_KHR_ray_tracing_pipeline和VK_KHR_acceleration_structure,程序员可以更加高效的模拟光线的传播,反射和折射,并能够跟踪光线在场景中的传播路径,计......
  • 洛谷P3258 [JLOI2014] 松鼠的新家
    Problem给定一棵树,再给出其在树上的移动顺序,从\(a_1\)开始,在\(a_n\)结束,求出每个节点最少需要经过多少次(终点即\(a_n\)的最后一次到达不算)。其中\(n\le3\times10^5\),\(1\lea_i\len\)且保证a是1~n的排列Solve不难想到最少遍历的次数就是全走最短路,而一棵树中u->v的最短......
  • python爬虫 - 进阶requests模块
      ......
  • Python Kivy 应用的进阶学习教程
    文章目录Kivy应用的进阶学习教程目录1.使用Buildozer打包Android应用1.1环境准备1.2创建基本Kivy应用1.3安装和配置Buildozer1.4打包Android应用1.5部署到Android设备2.打包iOS应用的基本步骤2.1MacOS开发环境2.2使用Xcode和Kivy2.3打包iO......
  • 20222325 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容缓冲区溢出基本知识:堆栈、函数调用。shellcode技术以及其在各平台的运用与防御。BOF攻击防御技术。2.实验目标本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另......
  • Scala函数进阶
    (一)函数的字面量用语法1,语法为:(参数列表)=>{方法体}2,函数的字面量作用由于scala的函数字面量没有定义函数名,所以可以通过变量进行调用。另外,也可以通过参数的方式进行调用,关于这种方式的介绍将在scala的函数高阶中进一步说明,这里不在展开叙述。3,scala的函数字面简化第一......