Codeforces 835 F Roads in the Kingdom(树形dp)

F. Roads in the Kingdom(树形dp)

题意:

给一张n个点n条边的无向带权图
定义不便利度为所有点对最短距离中的最大值
求出删一条边之后,保证图还连通时不便利度的最小值

$n <= 2e5 $
\(w_i <= 1e9\)

思路:树形dp

这个图是一个环上挂着很多颗树,首先把这个环处理出来,
删边只能在环上进行,所以可以先求出以环上每个点为根的树的直径和最大深度dep,
答案来源分为二种

  • 树内部两点最远距离 -> 直径 (树形dp 或者 两次bfs)
  • 两棵树深度最大的两点配对

假设环长度为\(k\),把环变成一个序列\(a_1,a_2,...,a_k\)\(a_0 = a_k\)
选择\(a_0\)做起点,用\(s_i\)表示第\(i\)个点到起点的距离

考虑每次断开的边为\(e(a_{i-1},a_i)\),那么答案分为三种情况

  • 序列\(1\)\(i-1\)中选两个点配对取最大值
  • 序列\(i\)\(k\)中选两个点配对取最大值
  • 前后各取一个点配对取最大值

计算第一种情况
假设取的两个点为\(1<=x<y<=i-1\),
则距离\(d = dep[x] + dep[y] + dis[x][y] = dep[x] - s[x] + dep[y] + s[y]\)
这样我们只需要顺序枚举维护\(dep[x] - s[x]\)的最大值即可
同理,第二种情况只需要逆序枚举维护\(dep[x] + s[x]\)的最大值即可

考虑第三种情况 假设取的点为\(1 <= x <= i - 1 , i <= y <= k\)
则距离\(d = dep[x] + dep[y] + dis[x][y] = dep[x] + dep[y] + s[k] - (s[y] - s[x])\)
$d = (dep[x] + s[k] + s[x]) + (dep[y] - s[y]) $
同理,顺序可算出第一部分最大值,逆序可以算出第二部分最大值

最后在删边后三种情况的最大值里取最小值再和树内部直径比较即可

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
#define ls(i) seg[i].lc
#define rs(i) seg[i].rc
using namespace std;
const int N = 2e5 + 10;
const LL inf = 1e18;
int read(){int x = 0;char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();return x;
}
vector<P>G[N];
int n,k;
int a[N],pa[N],e[N];
LL s[N],dep[N],ans;
void dfs(int u,int fa){pa[u] = fa;for(auto v:G[u]){if(v.first == fa) continue;if(pa[v.first] == 0) {e[v.first] = v.second;dfs(v.first,u);}else if(!k){int x = u;a[0] = v.first,s[1] = v.second;while(x != v.first) {a[++k] = x,s[k+1] = s[k] + e[x],x = pa[x];}a[++k] = v.first;}}
}
void dp(int u){pa[u] = 0;for(auto v:G[u]){if(pa[v.first] != 0){dp(v.first);ans = max(ans,dep[v.first] + v.second + dep[u]);dep[u] = max(dep[u], dep[v.first] + v.second);}}
}
LL sL[N],sR[N],L[N],R[N];///把环变成序列,断开的边左边配对,右边配对,左右配对的最大值
int main(){int u,v,w;n = read();for(int i = 1;i <= n;i++){u = read(),v = read(),w = read();G[u].push_back(P(v,w));G[v].push_back(P(u,w));}k = 0;ans = 0;dfs(1,-1);for(int i = 1;i <= k;i++) pa[a[i]] = 0;for(int i = 1;i <= k;i++) dp(a[i]);LL mx = -inf;L[0] = sL[0] = -inf;for(int i = 1;i <= k;i++){sL[i] = max(sL[i-1],dep[a[i]] + s[i] + mx);L[i] = max(L[i-1],dep[a[i]] + s[k] + s[i]);mx = max(mx, dep[a[i]] - s[i]);}sR[k+1] = R[k+1] = mx = -inf;for(int i = k;i >= 1;i--){sR[i] = max(sR[i+1],dep[a[i]] - s[i] + mx);R[i] = max(R[i+1],dep[a[i]] - s[i]);mx = max(mx, dep[a[i]] + s[i]);}LL tmp = inf;for(int i = 1;i <= k;i++) tmp = min(tmp,max(L[i-1]+R[i],max(sL[i-1],sR[i])));cout<<max(ans,tmp)<<endl;return 0;
}

转载于:https://www.cnblogs.com/jiachinzhao/p/7305578.html

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

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

相关文章

前端websocket获取数据后需要存本地吗_是什么让我放弃了restful api?了解清楚后我全面拥抱GraphQL...

GraphQL初步认识背景REST作为一种现代网络应用非常流行的软件架构风格&#xff0c;自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性&#xff0c;可扩展性&#xff0c;伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数…

列出薪金高于在部门30_我如何在五个月内将薪金提高一倍并获得一份了不起的工作...

列出薪金高于在部门30by Sam Williams通过山姆威廉姆斯 我如何在五个月内将薪金提高一倍并获得一份了不起的工作 (How I Doubled my Salary in Five Months and Got an Amazing Job) Six months ago I quit my job as a junior JavaScript developer and travelled around sou…

ftp服务器 vsftpd搭建和配置以及虚拟用户的设置

tp: File Transfer Protocol应用层协议&#xff1a;tcp, 21/tcpC/S&#xff1a;Client: 程序Server: 程序数据&#xff1a;命令连接&#xff1a;文件管理类命令&#xff0c;始终在线的连接数据连接&#xff1a;数据传输&#xff0c;按需创建及关闭的连接数据传输格式&#xff1…

计算机应用基础案例教程总结,计算机应用基础案例教程

包杰军等编著的《计算机应用基础案例教程》以培养职业能力为目标&#xff0c;本着“做学合一”、“理论与实践并行”、“知识与技能并重”的教育思想编写。本书将实际操作案例与教学内容紧密结合&#xff0c;结构清晰、内容翔实、图文并茂、实用性强。全书共分6章&#xff0c;第…

让不支持h5新标签的浏览器支持新标签

把这段js加到页面的头部就可以了&#xff0c;创建想让浏览器支持的标签即可 //条件判断是否支持 h5 if(window.applicationCache){alert("支持h5")}else{alert("不支持h5")document.createElement("article");document.createElement("head…

ios开发之--UIDocumentInteractionController的使用(实现更多分享服务)

最近在做项目的时候&#xff0c;碰到这样一个需求&#xff0c;就是本地生成pdf文件&#xff0c;然后本地打开&#xff0c;经过测试发现&#xff0c;pdf文件是无法保存到相册里面的&#xff0c;只能存到手机里面&#xff0c;鉴于苹果的存储机制&#xff0c;需要取出来&#xff0…

eclipse tomcat新建一个_Javaweb07-Eclipse自动创建动态web项目

学习笔记是参考的how2j使用Eclipse创建Dynamic Web Project前面的web项目都是通过手动创建的&#xff0c;现在使用eclipse EE自动创建动态web项目&#xff0c;熟悉一下创建流程&#xff0c;仍旧使用前面创建过的HelloServlet。需要注意的是&#xff0c;这里的tomcat版本变了&am…

python 删除重复字符_Google面试问题指南:使用Python删除重复出现的字符

python 删除重复字符by Anthony Sistilli安东尼西斯蒂里(Anthony Sistilli) Google面试问题指南&#xff1a;使用Python删除重复出现的字符 (Google Interview Question Guide: Delete Reoccurring Characters with Python) Nowadays, Google interviews are all the rage. Bu…

cordova

命令行 npm install -g cordova cordova create MyApp cd MyApp cordova platform add android 当然也可以把android换成browser把自己的前端程序放在www文件夹内这里注意如果用android studio打包或运行的话&#xff0c;&#xff08;即不用cordova&#xff09;&#xff0c;要把…

冒泡排序(Java版)

冒泡排序基本思想&#xff1a; 1.比较相邻的元素&#xff0c;如果第一个比第二个大&#xff0c;就交换它们两个。 2.对每一对相邻元素做同样的工作&#xff0c;从开始的第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 3.针对所有的元素重复以上的步…

计算机科学与技术专业的论文周报,毕业设计(实习)周报

本科毕业设计周报第1 周毕业生周记撰写毕业论文开题报告(初稿)&#xff0c;结合毕业设计所选的题目&#xff0c;查阅大量相关资料&#xff0c;主要针对该设计所涉及的背景&#xff0c;研究目的及意义&#xff0c;以及国内外的相关成熟技术进行筛选&#xff0c;提取部分核心内容…

excel导出_SpringBoot实现快速导出Excel

阅读本文约需要6分钟 大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了下MyBatis 几种通用的写法的相关知识&#xff0c;今天跟大家分享SpringBoot实现快速导出Exce…

SignalR Self Host+MVC等多端消息推送服务(4)

由于工作太忙&#xff0c;一直没时间更新博客&#xff0c;之前有很多朋友一直问我什么时候将后续的代码发上来&#xff0c;一直没时间&#xff0c;今天就长话短说&#xff0c;不写文章了&#xff0c;直接上demo&#xff0c;里面将正式项目中用到的一些敏感信息修改了&#xff0…

项目中需要总结的内容

1.铁塔项目的硬件总结 2.传感器项目的硬件总结 3.灯控项目的硬件总结 控制灯闪烁的电路&#xff0c;SIM卡板子复位电路&#xff0c;继电器控制电路转载于:https://www.cnblogs.com/yuesheng/p/6086647.html

计算机应用计算机电算化题库,2014年浙江省会计电算化客观题题库

第一套试题一、单选题1.在会计软件初始设置中&#xff0c;录入期初余额时(C)A&#xff0e;只要求录入一级科目的期初余额 B.只要求录入中间级科目的期初余额C&#xff0e;每级科目均需录入期初余额 D.只要求录入最末级科目的期初余额2.在总账系中&#xff0c;要求能够进行上下级…

使用一些我喜欢的东西开始使用ES6

by Todd Palmer托德帕尔默(Todd Palmer) 使用一些我喜欢的东西开始使用ES6 (Getting started with ES6 using a few of my favorite things) This tutorial walks you through some easy steps to get started learning the newest version of JavaScript: ES6.本教程将引导您…

A 子类继承父类,子类的构造函数会覆盖父类的构造函数

//子类 没有定义 构造 函数时&#xff0c;默认继承父类的构造方法&#xff1a;输出结果为 Class A... // 子类 定义了 构造 函数时&#xff0c;就不会继承父类的构造方法&#xff1a;输出结果是 Class B... <?php class A{ public function __construct(){ echo &qu…

fifo算法_缓存算法FIFO、LFU、LRU

阅读文本大概需要3分钟。0x01&#xff1a;FIFO算法FIFO(First in First out)&#xff0c;先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想&#xff0c;比如作业调度(先来先服务)&#xff0c;为什么这个原则在很多地方都会用到呢&#xff1f;因为这个原则…

Pile 0009: Vim命令梳理

正常模式&#xff08;按Esc或Ctrl[进入&#xff09; 左下角显示文件名或为空插入模式&#xff08;按i键进入&#xff09; 左下角显示--INSERT--可视模式&#xff08;按v键进入&#xff09; 左下角显示--VISUAL-- i 在当前位置生前插入 I 在当前行首插入 a 在当前位置后插入 A 在…

Introduction of Version Control/Git, SVN

Introduction of Version Control/Git, SVN 什么是版本控制&#xff1f; 你可以把一个版本控制系统&#xff08;缩写VCS&#xff09;理解为一个“数据库”&#xff0c;在需要的时候&#xff0c;它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照&#xff08;称之…