D. Choosing Capital for Treeland

Problem - 219D - Codeforces

问题描述:Treeland国有 n 个城市, 这 n 个城市连接成了一棵树, 靠单向道路相连, 现在政府想要选择一个城市作为首都, 条件是首都必须能到达其他所有城市, 现在我们不得不将一些道路反转方向, 记反转的条数为 k 条, 我们要找到所有使 k 最小的首都.

思路:树形dp。找一个根,从根向下遍历,可以求出以u为根的节点到其所有子节点需要反转几次。之后在遍历,求出节点v到它的所有父亲节点需要反转几次。

建树

题目给的是单向边,但是对于反转来说不好处理,可以将其建成双向边。对于<u,v>而言,它的边权是0,<v,u>的边权是1。

    for(int i = 1; i < n; ++i) {int u,v; cin>>u>>v;g[u].push_back({v,0});g[v].push_back({u,1});}

dfs1, f1[]

f1[u]表示,以u为根的节点到其所有子节点需要反转的次数。
F 1 [ u ] = ∑ v ∈ u 的儿子节点 ( F 1 [ v ] + w ) F1[u] = \sum_{v \in {u的儿子节点}}(F1[v] + w) F1[u]=vu的儿子节点(F1[v]+w)

    auto dfs1 = [&](auto dfs1, int u, int fu) -> void {for(auto t: g[u]) {int y = t.vf, w = t.vs;if(y == fu) continue;dfs1(dfs1, y,u);f1[u] += f1[y] + w;}};

dfs2, f2[]

f2[v]表示,以v为根的节点到其所有的父亲节点和和兄弟节点及其子节点需要反转的次数,换言之,就是到除了v的子节点之外的所有节点需要反转的次数。

image-20230905105421994

可以发现,到v的祖先的反转次数是f2[u]再加上<v,u>的边权。到其兄弟节点及其兄弟节点的子节点是:u到其儿子节点的反转次数 - v到其儿子节点的反转次数。img
F 2 [ v ] = F 2 [ u ] + ! w + F 1 [ u ] − F 1 [ v ] − w F2[v] = F2[u] + !w + F1[u] - F1[v] - w F2[v]=F2[u]+!w+F1[u]F1[v]w

最小反转次数

最小反转次数就是:
m i n v ∈ 树的节点 ( F 1 [ v ] + F 2 [ v ] ) min_{v \in 树的节点}(F1[v] + F2[v]) minv树的节点(F1[v]+F2[v])

代码

void solve() {int n; cin>>n;vector<vector<PII>> g(n + 1);vector<int> f1(n + 1), f2(n + 1);for(int i = 1; i < n; ++i) {int u,v; cin>>u>>v;g[u].push_back({v,0});g[v].push_back({u,1});}auto dfs1 = [&](auto dfs1, int u, int fu) -> void {for(auto t: g[u]) {int y = t.vf, w = t.vs;if(y == fu) continue;dfs1(dfs1, y,u);f1[u] += f1[y] + w;}};dfs1(dfs1, 1, -1);auto dfs2 = [&](auto &&dfs2, int u, int fu) -> void {for(auto t: g[u]) {int y = t.vf, w = t.vs;if(y == fu) continue;f2[y] = f2[u] + !w + f1[u] - f1[y] - w;dfs2(dfs2, y,u);}};dfs2(dfs2,1,-1);int mi = INF;for(int i = 1; i <= n; ++i) mi = min(f1[i] + f2[i], mi);cout<<mi<<endl;for(int i = 1; i <= n; ++i) {if(mi == f1[i] + f2[i]) {cout<<i<<" ";// return ;}}
}

https://zhuanlan.zhihu.com/p/568881717

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

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

相关文章

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION (论文解析)

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 摘要1 介绍2 相关工作3 重新审视 Transformers 和 DETR4 方法4.1 用于端到端目标检测的可变形transformer4.2 Deformable Detr的其他改进和变型5 实验5.1 和DETR 比较5.2 消融实验5.3 与最先进方法的…

构建知识库:一文解决跨平台科研文献及笔记同步问题

文章目录 需求及目标现有方案调研文献管理方案云存储方案Markdown编辑器Windows端Ipad端 图床管理方案 最终方案操作流程最后 作为一个十级懒人&#xff0c;要么躺着要么在探寻提效工具的路上。 开始打工生涯之后&#xff0c;除了正常工作时间&#xff0c;总想利用业余时间提升…

vscode调试程序设置

主要设置和json内容如下&#xff1a; cpp_properties.json内容&#xff1a; {"configurations": [ //C intellisense插件需要这个文件&#xff0c;主要是用于函数变量等符号的只能解析{"name": "Win32","includePath": ["${work…

【IC设计】Chisel开发环境搭建

首先安装一个Ubuntu的虚拟机 然后给Ubuntu换个镜像&#xff0c;方便下载 注意换源后使用apt-get update更新下 安装vim&#xff08;可以不做&#xff09; 这里安装Vim是我感觉Ubuntu自带的vi编辑器似乎有问题&#xff0c;因为我按i进入【插入模式】并没有提示&#xff0c;所以…

Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

--------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义&#xff1a; Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标…

离子风蛇有什么作用?

离子风蛇的工作原理是通过内置的高压发生器升至高压电晕空气生成正负离子&#xff0c;再随风流覆盖至物体表面&#xff0c;从而中和其所带的正负静电电荷&#xff0c;这是一种用在工厂里面的工业设备&#xff0c;主要的作用是用来消除静电&#xff0c;其次还可以达到除尘和杀菌…

计算机专业毕业设计项目推荐01-生产管理系统(JavaSpringBoot+原生Js+Mysql)

生产管理系统&#xff08;JavaSpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…

数据库原理及应用(MySQL)

建议大屏观看&#xff0c;避免格式错误&#xff0c;影响观感 目录 第一章 数据库系统概述 1.数据库系统概述 1.1.信息 1.2.数据 1.3.信息和数据之间的联系 1.4.数据库&#xff08;DB&#xff09; 1.5.数据库管理系统&#xff08;DBMS&#xff09; 1.6.数据库管理系统的…

Java多线程(一)多线程概要

多线程概要 多线程概要 什么是进程&#xff1f; 进程的特点&#xff1a; 什么是多线程 多线程编程&#xff1a; 创建线程 1.继承 Thread 类 2.实现 Runnable 接口 多线程的优势 中断问题&#xff1a; 1. 通过共享的标记来进行沟通 2. 调用 interrupt() 方法来通知 …

Python散点图

散点图 散点图是指在回归分析中&#xff0c;数据点在直角坐标系平面上的分布图&#xff0c;散点图表示因变量随自变量而变化的大致趋势&#xff0c;据此可以选择合适的函数对数据点进行拟合。用两组数据构成多个坐标点&#xff0c;考察坐标点的分布&#xff0c;判断两变量之间…

显示器鼠标滚动时或者拖拽文字变为绿色

新电脑&#xff0c;新显示器&#xff0c;看文章时滚动鼠标滑轮&#xff0c;文字颜色就变为绿色。 拖住文本文档或者浏览器等有文字的窗口&#xff0c;文字也会变为绿色。 静止时一点儿问题没有。 以下视频展示滚动和拖拽的操作&#xff0c;视频看不出变色&#xff0c;只参考…

科技云报道:AI时代,对构建云安全提出了哪些新要求?

科技云报道原创。 随着企业上云的提速&#xff0c;一系列云安全问题也逐渐暴露出来&#xff0c;云安全问题得到重视&#xff0c;市场不断扩大。 Gartner 发布“2022 年中国 ICT 技术成熟度曲线”显示&#xff0c;云安全已处于技术萌芽期高点&#xff0c;预期在2-5年内有望达到…

AOI软件之 CAD图纸导入功能

在这里&#xff0c;我不过多的解释AOI&#xff0c;半导体检测行业内的小伙伴自然会懂&#xff1b;我也不会过多解释何为diemap或者wafer-layout。因为我们本文的核心场景仅仅是cad图纸的解析和基本绘图的二次开发。而且我们紧紧是面向行业内的场景需求来说明此功能。 无图我说…

【Kafka】Kafka再平衡机制及相关参数

背景 Kafka作为一款基于发布订阅模式的消息队列&#xff0c;生产者将消息发送到Kafka集群&#xff08;Brokers&#xff09;中&#xff0c;消费者&#xff08;Consumer Group &#xff09;拉取消息进行消费&#xff0c;实现了异步机制。Kafka中&#xff0c;消费者通常以消费者组…

【Sentinel】ProcessorSlotChain处理器插槽链与Node

文章目录 1、Sentinel的基本概念2、ProcessorSlotChain3、Node 1、Sentinel的基本概念 Sentinel实现限流、隔离、降级、熔断等功能&#xff0c;本质要做的就是两件事情&#xff1a; 统计数据&#xff1a;统计某个资源的访问数据&#xff08;QPS、RT等信息&#xff09;规则判断…

Redis高并发分布式锁实战

高并发场景秒杀抢购超卖bug实战重现 秒杀抢购场景下实战JVM级别锁与分布式锁 大厂分布式锁Resisson框架实战 Lua脚本语言快速入门与使用注意事项 Redisson分布式锁源码剖析 Redis主从架构锁失效问题解析 从CAP角度剖析Redis与Zookeeper分布式锁区别 Redlock分布式锁原理与…

Qt QTreeWidge解决setItemWidget后,导致复选框失效

一、问题&#xff1a; QTreeWidget某一项加上itemWidget后&#xff0c;导致复选框失效问题 二、解决方法 将要加上的widget控件加到该项的后续的列&#xff0c;即控件跟复选框不同一列 三、具体代码 QTreeWidget* treeW new QTreeWidget; treeW->setColumnCount(2); /…

centos编译升级cmake,痛苦的Linux小白

环境 root 用户 下载 cmake官网下载地址&#xff1a;https://cmake.org/download/ 获取下载地址&#xff0c;右击cmake-3.27.4.tar.gz 命令行输入链接地址&#xff0c;下载 wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz解压 tar -zx…

Git_回退到上一次commit与pull

git 回退到上个版本 rollback 回滚 git reset HEAD&#xff0c; git 回退到上一版本

MySQL 连接查询

文章目录 1.什么是连接查询2.连接类型内连接交叉连接左连接右连接自然连接 3.连接条件4.隐式连接使用逗号连接表逗号与 JOIN 的优先级 5.全外连接6.小结参考文献 1.什么是连接查询 在关系型数据库管理系统&#xff08;RDBMS&#xff09;中&#xff0c;连接查询是一项重要的数据…