F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)

news2025/1/24 17:31:36

Problem - F - Codeforces

题目大意:有一棵n个点的树,其中有k个标记点,令点i到所有标记点的最远距离为fi,问所有点中fi的最小值是多少

1<=k<=n<=2e5

思路:我们首先考虑取得最小值的点在哪,我们假设这棵树是一条链,链上有两个标记点,如下图

显然,在标记点2、4之间的点是才可能是取得最小值的点,因为如果在某一个点一段的话,这个最大值一定大于两个标记点之间的距离,而在中间的点一定都是小于这个距离的,那么在这两个点之间很显然最中间的点是取得最小值的点。

所以取最小值的点一定在两个标记点的正中间,同时这两个标记点要距离最远,答案距离就是这个距离除以2向上取整。

要找两个距离最远的标记点,我们从任意一点i出发bfs找到一个最远的标记点j,这时有两种情况,一种就是这i,j就是距离最远的两个点,另一种情况是i在j和距离j更远的点k之间,

如上图,从4出发找到最远的点2,但右边的5距离2更远,这时候因为2已经是最靠左的一个点了,所以只要再从2再跑一遍bfs,找到的最远的点和2一定是距离最远的两个点,类似于问以哪个标记点为根,能找到根到标记点的最远距离。

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
vector<pair<int,int>>fac;
int tot = 0;
int n;
int head[N];
struct Edge
{
    int v, next;
}e[N*2];
int mark[N];
void addedge(int u, int v)
{
    e[++tot].v = v;
    e[tot].next = head[u];
    head[u] = tot;
}
bool vis[N];
void init()
{
    for (int i = 1; i <= n; i++)
    {
        vis[i] = 0;
        head[i] = -1;
        mark[i] = 0;
    }
}
void solve()
{
    int m;
    cin >> n;
    cin >> m;
    init();
    int it1 = -1;
    for (int i = 1; i <= m; i++)
    {
        int x;
        cin >> x;
        mark[x] = 1;
        if (it1 == -1)
            it1 = x;//任意找一个标记点作为起始根
    }
    for (int i = 1; i <= n - 1; i++)
    {
        int u, v;
        cin >> u >> v;
        addedge(u, v);
        addedge(v, u);
    }
    if (m == 1)
    {//如果只有1个标记点,那取最小值的点点就是那个标记点
        cout << 0 << '\n';
        return;
    }
    queue<pair<int, int>>q;
    q.push({ it1,0 });
    int ma = 0, mai;
    vis[it1] = 1;
    while (!q.empty())
    {//bfs找到距离根最远的点
        int u = q.front().first, nd = q.front().second;
        q.pop();
        for (int i = head[u]; ~i; i = e[i].next)
        {
            int v = e[i].v;
            if (vis[v])
                continue;
            vis[v] = 1;
            q.push({ v,nd + 1 });
            if (mark[v] && nd + 1 > ma)
            {
                ma = nd + 1, mai = v;
            }
        }
    }
    q.push({ mai,0 });//以之前找到的最远标记点为新根
    vis[mai] = 1;
    ma = 0, mai = -1;
    for (int i = 1; i <= n; i++)
    {
        vis[i] = 0;
    }
    while (!q.empty())
    {
        int u = q.front().first, nd = q.front().second;
        q.pop();
        for (int i = head[u]; ~i; i = e[i].next)
        {
            int v = e[i].v;
            if (vis[v])
                continue;
            vis[v] = 1;
            q.push({ v,nd + 1 });
            if (mark[v] && nd + 1 > ma)
            {
                ma = nd + 1, mai = v;
            }
        }
    }
    cout << (ma - 1) / 2 + 1;//答案就是最远距离/2
    cout << '\n';
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    //FILE* stream1;
    //freopen_s(&stream1, "in.txt", "r", stdin);
    //freopen_s(&stream1, "out.txt", "w", stdout);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

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

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

相关文章

MatrixOne Logtail 设计解析

Logtail 是 CN&#xff08;Computation Node&#xff09;与 TN&#xff08;Transaction Node&#xff09;之间的一种日志同步协议&#xff0c;是 CN 和 TN 协同工作的基础。本文将介绍 logtail 协议的基本定位&#xff0c;协议内容和产生过程&#xff0c;也会提及一些遇到的挑战…

银河麒麟服务器x86安装qemu虚拟机

安装虚拟机 桌面右键&#xff0c;选择在终端中打开 输入下面的脚本 yum install -y virt-viewer virt-v2v libvirt* qemu* virt-manager 等待安装完成 安装成功 打开虚拟机软件 新建虚拟机&#xff0c;以windows server 2019为例 选择镜像 点击前进 点击&#xff1a;是 设置…

springboot实战(十)之全网最全RabbitMQ集成

序言 首先我要抛出几个问题让大家思考一下&#xff1a;为什么你的项目中要用MQ呢&#xff1f;使用MQ为你解决了什么问题&#xff1f;当然解决问题的同时它又有哪些弊端值得注意&#xff1f; 如果你不太清楚或者你根本没有考虑过&#xff0c;那么请往下看你会找到你想要的答案。…

安科瑞预付费电能管理系统在学生公寓的应用与分析

安科瑞 崔丽洁 摘要&#xff1a;论文设计了适用于学生公寓的自助式预付费控电控水管理系统&#xff0c;采用多种智能功能&#xff0c;可以监测和显示漏电现象&#xff0c;通过短路、跳线、零线接地等方式防范和记录用户的偷电行为&#xff0c;通过报警和拉闸防止事故的发生。预…

天洑参展第三十五届中国仿真大会

2023年10月14日&#xff0c;由安徽省政府、中国仿真学会主办的第三十五届中国仿真大会在安徽合肥召开。中国仿真大会自1989年起每年举办一次&#xff0c;是国内仿真领域规模最大、综合性和影响力最强的大型综合性学术会议。本届学术会以“数字经济、仿真发展”为主题&#xff0…

家电商城小程序制作的流程和好处

在当今的数字化时代&#xff0c;拥有一个自己的家电商城小程序对于家电销售商来说是必不可少的。它不仅可以帮助你扩大市场覆盖范围&#xff0c;还可以提高销售额和客户满意度。那么&#xff0c;如何制作一个家电商城小程序呢&#xff1f;以下是详细的流程和好处。 首先&#x…

【动态规划】1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 1143. 最长公共子序列&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 1035. 不相交的线&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#…

HBase:大数据中的NoSQL

HBase概述 Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于存储海量的结构化或者半结构化&#xff0c;非结构化的数据&#xff0c;底层上的数据是以二进制流的形式存储在 HDFS 上的数据块中的 HBase应用场景 写密集型应用&#xff0c;每天写入…

E055-web安全应用-File Inclusion文件包含漏洞初级

课程名称&#xff1a; E055-web安全应用-File Inclusion文件包含漏洞初级 课程分类&#xff1a; web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请&#xff0c;对该公司旗下网站进行安全检测&#xff0c;经过一番检查发现了该论坛的某个页面存…

强烈推荐!超低温冰箱监控教程

超低温冰箱监控是在医疗、科研和工业领域中至关重要的技术&#xff0c;被用于储存和保护生物样本、药物、疫苗以及其他温度敏感的物品。有效的监控系统可以确保这些贵重物品在极端低温条件下的安全性和稳定性。 客户案例 医疗研究院 广东某医疗研究院需要存储大量的生物样本和…

【Cisco ios的三种命令模式,可收藏!】

一&#xff1a;前言 IOS(InternetWork Operating System 互联网操作系统)是Cisco网络设备的核心系统软件&#xff0c;IOS用户界面是命令行接口界面&#xff0c;用户可以通过输入命令实现对网络设备的配置和管理。 为了安全&#xff0c;IOS提供了三种命令行模式&#xff0c;分…

嵌入式实时操作系统的设计与开发(调度策略学习)

将调度分为两层&#xff0c;上层为策略&#xff0c;下层为机制&#xff0c;并且采用策略与机制分离的设计原则&#xff0c;可以方便灵活地扩展调度策略&#xff0c;而不改变底层的调度机制。 调度策略就是如何确定线程的CPU、优先级prio等参数&#xff0c;线程是按照FIFO&…

Sui第六轮资助:15个项目共获得106万美元的资助

近日&#xff0c;Sui基金会宣布了15个项目获得共计106万美元的资助&#xff0c;用于构建项目以推动Sui的采用和发展。要获得资助&#xff0c;项目必须提交详细描述其正在构建的内容、逐项预算、关键里程碑、团队经验以及对Sui社区预期贡献的提案。 获得资助的15个项目致力于跨…

WPF 用户控件依赖注入赋值

前言 我一直想组件化得去开发WPF&#xff0c;因为我觉得将复杂问题简单化是最好的 如何组件化开发 主窗口引用 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.…

如何将前后端分离项目部署到本地的Docker Desktop容器运行并且访问

文章目录 前言 完成了客户的一个前后端分离项目&#xff0c;要求部署到客户电脑上去展示&#xff0c;那肯定不能直接把代码弄上去跑呀~~~&#xff0c;于是我就想把他们都打包部署到本地的docker容器里面&#xff0c;方便运行和访问&#xff0c;so&#xff0c;以下内容就详细介…

封装canvas选择区域的组件

大家好&#xff0c;我是南宫&#xff0c;最近我刚完成了一个canvas相关组件的封装。我个人其实很怕canvas和地图&#xff0c;就感觉这里有很复杂的操作&#xff0c;搞不懂&#xff0c;所以这次封装完了以后&#xff0c;决定写一篇博客来记录。 首先我先简单介绍一下这个组件的…

【仙逆】王林极限跑酷,藤厉自食恶果,仙逆战斗获好评,张虎命运被改写

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 最新一集《仙逆》已经更新&#xff0c;相信很多小伙伴都已经先睹为快&#xff0c;在击杀了白展之后&#xff0c;张虎和王林担心其师傅即墨老人报复&#xff0c;因此躲到看似安全的藤家城&#xff0c;以为那里有…

MySQL学习(三)——多表连接查询

文章目录 1. 多表关系1.1 一对多1.2 多对多1.3 一对一 2. 概述2.1 数据准备2.2 简单查询2.3 分类 3. 内连接4. 外连接5. 自连接5.1 自连接查询5.2 联合查询 6. 子查询6.1 概念6.2 标量子查询6.3 列子查询6.4 行子查询6.5 表子查询 1. 多表关系 项目开发中&#xff0c;在进行数…

UE5 运行时生成距离场数据

1.背景 最近有在运行时加载模型的需求&#xff0c;使用DatasmithRuntimeActor可以实现&#xff0c;但是跟在编辑器里加载的模型对比起来&#xff0c;室内没有Lumen的光照效果。 图1 编辑器下加载模型的效果 图2 运行时下加载模型的效果 然后查看了距离场的数据&#xff0c;发现…

leetcode-48.旋转图像

1. 题目 leetcode题目链接 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 2. 编程 矩阵转置&#xff1a; 遍历矩阵&#x…