P10418 [蓝桥杯 2023 国 A] 相连的边 题解

news/2024/12/22 1:19:27/文章来源:https://www.cnblogs.com/Sundar-2022/p/18448593

一个比较有趣的树形 DP,情况比较多。

【题目简述】

给定一棵树,求三条相连的边,其边权之和最大。

【思路】

以 X 代表当前节点,S 表示儿子,G 表示孙子,P 表示父节点。

首先把树建出来,在以下图中,我们模拟二号点的 DP 过程,考虑以下几种情况:

  • 有一条边指向父节点时

    • FG(Father Grandson):一条边指向父节点,另外两条边指向孙子。

      需要维护指向孙子的路径的最大值。

    • FSS(Father Son Son):一条边指向父节点,另外两条边指向两个不同的儿子。

      需要维护指向儿子的路径的最大、次大值。

  • 没有边指向父节点时

    • GS(Grandson Son):一条边指向孙子,另外一条边指向另一个儿子。

      需要维护指向儿子的路径的最大、次大值和指向孙子的路径的最大、次大值(可能这两条路径重合)

    • SSS(Son Son Son):三条边指向三个不同的儿子。

      需要维护指向儿子的路径的最大、次大、第三大值。

  • 要维护的东西:指向儿子的路径的最大、次大、第三大值,指向孙子的路径的最大、次大值。

于是代码就很好写了。

【Code】

#include <bits/stdc++.h>
#define int long long
using namespace std;vector<pair<int,int>>Edge[200005];
int n,u,w,ans;int DFS(int u,int fa,int W){int max11=0,flag11=0,max12=0,flag12=0,max13=0,flag13=0; //max1x,flag1x:向 Dis(X,S) x 大值及儿子编号 int max21=0,flag21=0,max22=0,flag22=0;                  //max2x,flag2x:向 Dis(X,G) 的路径的 x 大值及儿子编号 for(auto it:Edge[u]){int v=it.first,DisXS=it.second;if(v!=fa){int DisSG=DFS(v,u,DisXS);  //Dis(S,G) 的最小值//如果儿子还有儿子(有孙子),更新到 Dis(X,G) 的最大、次大值 if(DisSG!=0){int DisXG=DisXS+DisSG;if(max21<DisXG)      max21=max21,flag22=flag21,max21=DisXG,flag21=v;else if(max22<DisXG) max22=DisXG,flag22=v;}//更新到 Dis(X,S) 的最大、次大、第三大值  if(max11<DisXS)      max13=max12,flag13=flag12,max12=max11,flag12=flag11,max11=DisXS,flag11=v;else if(max12<DisXS) max13=max12,flag13=flag12,max12=DisXS,flag12=v;else if(max13<DisXS) max13=DisXS,flag13=v;}}//W 表示到父节点的路径长度 if(u!=1)           ans=max(ans,max21+W);                 //FGif(u!=1)           ans=max(ans,max11+max12+W);           //FSSif(flag11!=flag21) ans=max(ans,max11+max21);             //GS(两条路径不重合) if(flag11==flag21) ans=max({ans,max11+max22,max12+max21}); //(两条路径重合,其中一条选择次长路) ans=max(ans,max11+max12+max13);                          //SSSreturn max11;
}signed main()
{scanf("%lld",&n);for(int v=2;v<=n;v++){scanf("%lld%lld",&u,&w);Edge[u].push_back({v,w});Edge[v].push_back({u,w});}DFS(1,0,0);printf("%lld",ans);return 0;
}

【闲话】

祝所有看到这篇题解的人 CSP2024 RP++!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/808759.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

订单交易平台三(登录界面整个实现过程)阶段一(只实现简单的登录功能)

1.在视图函数account进行写代码逻辑(需要了解django中form组件的知识、md5码加密、脚本的编写) 1.1 登录界面后端的编写 """ 在account.py文件 """from django.shortcuts import render, redirect from web import modelsfrom utils.encrypt …

订单交易平台二(写代码之前的准备工作)

订单交易平台准备工作 1.先搭建环境 # 1.先创建python基本环境,并且创建虚拟环境# 2.创建完成后,先安装你所需要的Django版本: pip install Django==3.2# 3.创建Django项目: django-admin startproject app01 .# 4.创建Django,在app01根目录文件下创建apps文件,里面放app文…

PM的正交调解法

1.PM的模拟调制过程 ​ PM信号是一种相位调制信号,其携带的信息保存在其信号的相位中,通过改变载波的相位来实现基带数据的传输。 其函数表达式如下: \[s(t) = A*cos(w_c*t + K_f*m(t)) \]其中: \(A\):表示载波幅度。 \(m(t)\):表示基带信号。 \(w_c\):表示载波信号角度增量…

监控室值班人员脱岗睡岗识别系统

监控室值班人员脱岗睡岗识别系统基于Yolov7深度学习神经网络算法,监控室值班人员脱岗睡岗识别系统可以7*24小时不间断自动监控总监控室值班人员是否在工位上(脱岗睡岗玩手机),若值班人员没有在总监控室系统则立即抓拍告警,算法鲁棒性强。监控室值班人员脱岗睡岗识别系统检…

监控室值班人员脱岗识别系统

监控室值班人员脱岗识别系统通过AI视觉技术,监控室值班人员脱岗识别系统实现企业总监控室值班人员脱岗、睡岗、玩手机等场景的AI识别,不需人为干预全天候自动识别。监控室值班人员脱岗识别系统通过建设视频监控智能识别功能赋能企业端,监控室值班人员脱岗识别系统对各个生产…

非煤矿山电子封条

非煤矿山电子封条 支持对接甘肃省矿山监管平台通过AI智能分析技术,非煤矿山电子封条可以实现矿山与甘肃省应急管理部门互联互通,非煤矿山电子封条 支持对接甘肃省矿山监管平台通过在关键地点(关键位置包括矿山主副井口、风井口、车辆出入口和调度室)安装摄像机,非煤矿山电…

甘肃省非煤矿山电子封条建设方案

甘肃省非煤矿山电子封条建设方案通过AI视频智能分析技术,甘肃省非煤矿山电子封条建设方案利用在煤矿风井口、煤矿调度室、煤矿主副井口、矿区车辆出入口重要位置安装摄像机,甘肃省非煤矿山电子封条建设方案对非煤矿区生产作业状态以及矿井出井入井人员数量变化、监控室人员睡…

校园食堂明厨亮灶监控分析系统

校园食堂明厨亮灶监控分析系统通过yolov5网络模型技术,校园食堂明厨亮灶监控分析系统针对校园餐厅后厨厨师穿戴及行为进行7*24小时不间断实时分析预警,如:不按要求戴口罩、不穿厨师帽、陌生人员进入后厨、厨师不穿厨师服、上班时间玩手机、老鼠识别等行为。校园食堂明厨亮灶…

工服智能监测预警系统

工服智能监测预警系统通过yolov8网络模型算法,工服智能监测预警系统对摄像机画面内出现的人员着装穿戴实时监测,当检测到现场人员未按要求穿戴工服工装则输出报警信息,通知后台值班人员及时处理。工服智能监测预警系统无需新增硬件,利用最新的深度学习技术,基于现场监控视…

ai皮带跑偏撕裂监测系统功能

ai皮带跑偏撕裂监测系统功能基于人工智能视觉技术,ai皮带跑偏撕裂监测系统功能自动识别现场监控画面中传送皮带撕裂、跑偏、偏移等情况,当ai皮带跑偏撕裂监测系统功能检测出皮带出现撕裂或者跑偏现象后,立即告警抓拍存档同步回传后台提醒及时处理,提高煤矿的智能化水平和人…

订单交易平台一

简介:订单交易平台核心的功能模块:认证模块,用户名密码 或 手机短信登录(60s有效)。角色管理,不同角色具有不同权限 和 展示不同菜单。 管理员,充值客户,下单客户管理,除了基本的增删改查以外,支持对客户可以分级,不同级别后续下单折扣不同。交易中心管理员可以给客…