当前位置: 首页 > news >正文

洛谷 P6419 COCI2014/2015 #1 Kamp 题解

题意

一颗树 n n n 个点, n − 1 n-1 n1 条边,经过每条边都要花费一定的时间,任意两个点都是联通的。

k k k 个人(分布在 k k k 个不同的点)要集中到一个点举行聚会。

聚会结束后需要一辆车从举行聚会的这点出发,把这 K K K 个人分别送回去。

请你回答,对于 i = 1 ∼ n i=1 \sim n i=1n ,如果在第 i i i 个点举行聚会,司机最少需要多少时间把 k k k 个人都送回家。

1 ≤ k ≤ n ≤ 5 × 1 0 5 1 \le k \le n \leq 5\times 10^5 1kn5×105 1 ≤ x , y ≤ n 1 \le x,y \le n 1x,yn 1 ≤ z ≤ 1 0 8 1 \le z \le 10^8 1z108

思路

这是一道换根dp

直接计算从一个点出发,经过所有家之后最后在一个点停下的最短路程,是比较难的。但是可以维护从一个点出发,再回到自己的最短路程,减去该点到其中一个家的最长链,那也是答案。

第一个dfs

经典地,先用第一个dfs处理子树内信息。

v i s u vis_u visu标记 u u u是否为一个家, s v u sv_u svu表示 u u u子树内有多少有家之人。

g u g_u gu表示,在 u u u子树内,从 u u u出发走完所有有家之人再回到 u u u的最短距离,那么在处理边 ( u , v ) (u,v) (u,v),边权为 w w w时,有:
g u = 2 w + ∑ v ∈ s o n u g v g_u=2w+\sum_{v\in son_u}g_v gu=2w+vsonugv

w w w要乘 2 2 2是因为要走来回。

那么到维护最长链了,先维护子树内的最长链;不过为了在第2次dfs中,处理全局的最长链信息,涉及到两个点 ( u , v ) (u,v) (u,v)的次序问题(即 u u u成为 v v v子树内的一点),还需要维护一个次长链来保证正确性。

D u D_u Du表示 u u u节点开始子树内最长链, s D u sD_u sDu表示 u u u节点开始子树内次长链;可以用一个 n x u nx_u nxu记录该最长链上, u u u的下一个节点(因为在最长链上任一节点 x x x子树的、由 x x x开始的最长链,必然与 u u u开始的最长链重合)

void dfs1(ll u,ll fa)
{if(vis[u])sv[u]=1;for(int i=head[u];i;i=e[i].next){ll v=e[i].to,w=e[i].w;if(v==fa)continue;dfs1(v,u);if(sv[v]){g[u]+=g[v]+2*w;if(w+D[v]>=D[u]){sD[u]=D[u];D[u]=w+D[v];nx[u]=v;}else if(w+D[v]>sD[u])sD[u]=w+D[v];}sv[u]+=sv[v];} 
}

第二个dfs

在第二个dfs中,我们将处理整棵树内的信息了。

f u f_u fu表示,在整棵树中,从 u u u出发走完所有有家之人再回到自己的最短路程。

在第一个dfs中,我们记录了 s v u sv_u svu表示 u u u子树内有多少有家之人;对于一个节点 u u u和后继结点 v v v,考虑利用 s v u sv_u svu s v v sv_v svv进行分类讨论:

s v v = k sv_v=k svv=k

那么和子树的情况没有区别,也不必更新最长链、次长链了,直接 f v = g v f_v=g_v fv=gv即可。

s v v = 0 sv_v=0 svv=0

那么说明 v v v的子树内没有人有家,在第一次dfs时 u u u并没有往 v v v的方向更新。此处可以看作 u u u是在 v v v的子树内,需要倒着用 u u u来更新 v v v。(并且可以直接更新,比大小都可以不需要qwq)

其余情况

u u u v v v子树内都有有家之人。设最长链分布如图所示:
在这里插入图片描述
w w w为边 ( u , v ) (u,v) (u,v)的边权

更新 D v D_v Dv

D u + w ≥ D v D_u+w \ge D_v Du+wDv n x u ≠ v nx_u \ne v nxu=v(即 v v v不在 u u u的原本的最长链上),直接更新 D v D_v Dv,若 n x u = v nx_u=v nxu=v则不能更新。

s D u + w ≥ D v sD_u+w \ge D_v sDu+wDv,并没有影响,直接继承即可。

更新 s D v sD_v sDv

与上相同

void dfs2(ll u,ll fa)
{for(int i=head[u];i;i=e[i].next){ll v=e[i].to,w=e[i].w;if(v==fa)continue;if(!sv[v])//v子树内无家,倒着更新 {if(D[u]+w>=D[v]){sD[v]=D[v];D[v]=D[u]+w;f[v]=f[u]+2*w;}	}else if(k-sv[v]==0)f[v]=g[v];else //更新D(v) {f[v]=f[u];if(D[u]+w>=D[v]&&nx[u]!=v){sD[v]=D[v];D[v]=D[u]+w;nx[v]=u;}else if(sD[u]+w>=D[v]){sD[v]=D[v];D[v]=sD[u]+w;nx[v]=u;}else if(D[u]+w>=sD[v]&&nx[u]!=v)sD[v]=D[u]+w;else if(sD[u]+w>=sD[v])sD[v]=sD[u]+w;}dfs2(v,u);}
}

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5e5+9;
ll n,k;
ll idx,head[N];
ll sv[N],vis[N],D[N],sD[N],nx[N],f[N],g[N];
//sv(u):u子树内总共多少有家之人
//D/sD(u):u起点最长次长链
//nx(u): 最长链上下一个节点
//g(u):u子树内走完所有有家之人回u的最短距离
//f(u):整棵树内走完所有有家之人回u的最短距离
struct edge
{ll to,next,w;
}e[N<<1];
void addedge(ll u,ll v,ll w)
{idx++;e[idx].to=v;e[idx].next=head[u];e[idx].w=w;head[u]=idx;
}
void dfs1(ll u,ll fa)
{if(vis[u])sv[u]=1;for(int i=head[u];i;i=e[i].next){ll v=e[i].to,w=e[i].w;if(v==fa)continue;dfs1(v,u);if(sv[v]){g[u]+=g[v]+2*w;if(w+D[v]>=D[u]){sD[u]=D[u];D[u]=w+D[v];nx[u]=v;}else if(w+D[v]>sD[u])sD[u]=w+D[v];}sv[u]+=sv[v];} 
}
void dfs2(ll u,ll fa)
{for(int i=head[u];i;i=e[i].next){ll v=e[i].to,w=e[i].w;if(v==fa)continue;if(!sv[v])//v子树内无家,倒着更新 {if(D[u]+w>=D[v]){sD[v]=D[v];D[v]=D[u]+w;f[v]=f[u]+2*w;}	}else if(k-sv[v]==0)f[v]=g[v];else //更新D(v) {f[v]=f[u];if(D[u]+w>=D[v]&&nx[u]!=v){sD[v]=D[v];D[v]=D[u]+w;nx[v]=u;}else if(sD[u]+w>=D[v]){sD[v]=D[v];D[v]=sD[u]+w;nx[v]=u;}else if(D[u]+w>=sD[v]&&nx[u]!=v)sD[v]=D[u]+w;else if(sD[u]+w>=sD[v])sD[v]=sD[u]+w;}dfs2(v,u);}
}
int main()
{scanf("%lld%lld",&n,&k);for(int i=1;i<n;i++){ll u,v,w;scanf("%lld%lld%lld",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);}for(int i=1;i<=k;i++){ll u;scanf("%lld",&u);vis[u]=1;}dfs1(1,0);f[1]=g[1];dfs2(1,0);for(int i=1;i<=n;i++)printf("%lld\n",f[i]-D[i]);return 0;
}

相关文章:

洛谷 P6419 COCI2014/2015 #1 Kamp 题解

题意 一颗树 n n n 个点&#xff0c; n − 1 n-1 n−1 条边&#xff0c;经过每条边都要花费一定的时间&#xff0c;任意两个点都是联通的。 有 k k k 个人&#xff08;分布在 k k k 个不同的点&#xff09;要集中到一个点举行聚会。 聚会结束后需要一辆车从举行聚会的这点…...

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm&#xff1a;确保已安装 Node.js 和 npm。 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个…...

AI会话问答的页面滚动处理(参考deepseek页面效果)

近期在接入deepseekR1的深度思考&#xff0c;研究了下deepseek官网的滚动效果&#xff0c;大概如下&#xff1a;用户发出消息后&#xff0c;自动滚动到页面最底部&#xff0c;让最新消息展示在视野中&#xff0c;这时候&#xff0c;我们先处理一次滚动&#xff1a; const scrol…...

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…...

MongoDB 入门操作指南

文章目录 MongoDB 入门操作指南1. 连接到 MongoDB 数据库2. 查看当前数据库3. 显示所有数据库4. 切换或创建数据库5. 查看当前数据库中的所有集合6. 创建集合7. 插入文档插入单个文档插入多个文档 8. 查询文档查询所有文档查询匹配条件的文档格式化查询输出 9. 更新文档更新单个…...

共享设备管理难?MDM助力Kiosk模式一键部署

目录 1. 简化设备部署与配置&#xff1a;实现一键式部署 2. 自动化应用更新与内容推送&#xff1a;确保设备始终保持最新状态 3. 权限控制与设备安全&#xff1a;防止滥用与数据泄露 4. 远程管理与故障诊断&#xff1a;保障设备长期稳定运行 5. 数据分析与报告&#xff1a…...

HttpClient-Java程序中发送Http请求

配置 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> ps:aliyun-sdk-oss中已引入上述配置 HttpClient的核心API&#xff1a; Htt…...

硬件-电源-隔离与非隔离的区别

文章目录 一&#xff1a;隔离电源与非隔离电源1.1 充电器触电新闻1.2 电路拓扑1.3 隔离电源与非隔离电源的优缺点1.3 隔离电源与非隔离电源的选择1.3.1 隔离电源1.3.2 非隔离电源 二&#xff1a;注意事项2.1 隔离电源结构图2.1 隔离耐压测试方法 三&#xff1a;感悟道友&#x…...

Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案

1. 如何在 Kubernetes 中设置资源请求和限制&#xff1f; 资源请求确保容器有最小资源量&#xff08;CPU/内存&#xff09;&#xff0c;而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例&#xff1a; resources:requests:memory: "256Mi&…...

Training for Computer Use

Training for Computer Use 核心事件&#xff1a;多家科技公司推出能操控计算机的智能体&#xff0c;字节跳动和清华大学团队引入UI - TARS模型&#xff0c;展示了训练模型实现计算机操控能力的新成果。 UI - TARS模型 基本信息&#xff1a;是视觉 - 语言模型Qwen2 - VL的微调版…...

PH热榜 | 2025-02-14

1. Beatoven.ai 标语&#xff1a;能创作完美背景音乐的AI作曲家 介绍&#xff1a;Beatoven.ai 能根据简单的提示生成惊艳的背景音乐&#xff0c;用于你的内容创作。它是由世界各地的真实音乐家倾力打造&#xff08;并使用了大量数据&#xff09;。无需任何音乐专业知识&#…...

工业物联网远程监控系统优化方案,基于巨控GRM553Y-CHE

工业物联网远程监控系统优化方案 ——基于巨控GRM553Y-CHE的西门子S7-1500 PLC多站点无线集成方案 1. 项目背景与概述 巨控科技作为工业物联网解决方案提供商&#xff0c;专注于PLC无线通信与远程监控技术研发&#xff0c;其YunPLC安全平台已服务超30,000工业终端&#xff0c…...

报名丨Computer useVoice Agent :使用 TEN 搭建你的 Mac Assistant

与 TEN 相聚在「LET’S VISION 2025」大会&#xff0c;欢迎来展位上跟我们交流。这次我们还准备了一场聚焦「computer use」的工作坊&#xff0c;功能新鲜上线&#xff0c;线下首波体验&#xff01; &#x1f4c5; TEN 展位&#xff1a;2025年3月1日-2日 TEN workshop&#x…...

Flutter 中的生命周期

在 Flutter 中&#xff0c;StatefulWidget 和 StatelessWidget 这两种 Widget 的生命周期不同&#xff0c;主要关注的是 StatefulWidget&#xff0c;因为它涉及到状态的管理和更新。 StatefulWidget 的生命周期&#xff1a; 1. 创建阶段 (Create) createState()&#xff1a;…...

深度整理总结MySQL——redoLog日志工作原理

redo log的工作原理 前言概念为什么需要redo log修改undo页面,会记录对应的redo log吗redo log 和undo log 区别在哪什么是WAL技术redo log要写入磁盘,数据也要写入磁盘,为什么多此一举产生的redo log直接写入磁盘吗redo log 什么时候刷盘innodb_flush_log_at_trx_commit 参数参…...

备战蓝桥杯 Day1 回顾语言基础

开启蓝桥杯刷题之路 Day1 回顾语言基础 1.配置dev 工具->编译选项->勾选编译时加入以下命令->设定编译器配置(release和debug)都要-> -stdc11 ->代码生成/优化->代码生成/优化->语言标准(-std)->ISO C11 ->代码警告->显示最多警告信息(-Wall)…...

小记大模型本地部署:vllm, lmdeploy, ollama

记录一下最近折腾的大模型本地部署。由于学校有部署deepseek的竞赛&#xff08;觉得扯不&#xff1f;&#xff09;所以首选ollama这种超级简单的来过关&#xff0c;但我最希望的还是用专门的推理工具部署&#xff0c;因为做应用开发推理速度一定最重要。所以先尝试自己想搞的vl…...

MySQL查看存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...

从零到一:开发并上线一款极简记账本小程序的完整流程

从零到一&#xff1a;开发并上线一款极简记账本小程序的完整流程 目录 前言需求分析与功能设计 2.1 目标用户分析2.2 核心功能设计2.3 技术栈选择 开发环境搭建 3.1 微信开发者工具安装与配置3.2 项目初始化3.3 版本控制与协作工具 前端开发 4.1 页面结构与布局4.2 组件化开发…...

卷积神经网络实战人脸检测与识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...