【每日一题】阈值距离内邻居最少的城市

news2024/11/24 8:02:08

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:多源最短路
  • 写在最后

Tag

【多源最短路】【数组】【2023-11-14】


题目来源

1334. 阈值距离内邻居最少的城市


题目解读

题目翻译过来是这样的:一共 n 个城市,统计在每个城市 dt 距离范围内所有的其他城市的数目的最小值:

  • 如果有多个最小值,返回城市的最大编号;
  • 否则返回唯一的城市编号。

解题思路

方法一:多源最短路

本题需要统计从每个城市出发到达其他城市的最短路径,根据 最短路径小于阈值路径 得到每个城市阈值范围内的可到达城市数量,最后返回最少可到达城市对应的最大编号的出发城市。

实现上,从大到小枚举城市编号作为出发城市,计算该城市阈值范围内的可到达城市数量,如果后续枚举的城市有更小的可到达城市数量,则更新后续的城市为新的答案,否则当前枚举的城市就是最后的答案。

如何某个城市阈值范围内的可到达城市数量?

这是单源最短路径问题。首先根据 edges 建立边权图 mat,二维数组 mat 初始化为 -1根据 edges 数组更新一些边之间的权重。

维护一个数组 dist,表示从城市 u 出发到达某个城市的最小距离,初始化为 -1。接着利用广度优先搜索从 u 向外扩展,更新 u 到其他城市的最小距离,具体地:

  • 初始化队列 q,源点 u 入队,dist[u] = 0
  • 依次从队列中取出节点 t,直到队列为空:
    • 先进行一次剪枝,如果 dist[t] > dt,(dt 是题目设置的距离阈值)直接跳过节点 t,重新选取节点出发。
    • 枚举其他所有城市节点 i,如果 mat[t][i] = -1,则跳过当前节点(城市节点 ti 无法相到达):
      • 更新 u 到当前城市 i 的最短距离,如果 dist[i] = -1 或者经城市 t 到城市 i 比直接从城市 ui 距离小,则更新 u 到当前城市 i 的最短距离为中转方案的最小距离,并将 i 加入队列中;
  • 队列为空后,统计从 dist[i] != -1 的数量 cnt,即为从城市 u 出发阈值范围内的可到达城市数量。

以下是具有 C 语言风格的 C++ 代码。

实现代码

#define maxn 110
#define inf -1

class Solution {
privateint mat[maxn][maxn];

    int Min(int a, int b){
        if(a == inf) return b;
        if(b == inf) return a;
        return a < b ? a : b;
    }

    // 计算从 u 城市出发,在 dt 范围内能到达的城市数量,一共是 n 个城市
    int spfa(int n, int u, int dt){
        int i;
        queue<int> q;
        int dist[maxn];         // 从城市 u 出发到达某个城市的距离
        memset(dist, inf, sizeof(dist));
        dist[u] = 0;
        q.push(u);

        while(!q.empty()){
            int t = q.front();
            q.pop();
            if(dist[t] > dt){
                continue;
            }
            for(i = 0; i < n; ++i){
                if(mat[t][i] == inf){
                    continue;// 说明 t 城市无法到 i 城市
                }
                int toDist = dist[t] + mat[t][i];   // 从城市u到城市i的距离
                if(dist[i] == inf || toDist < dist[i]){
                    dist[i] = toDist;
                    q.push(i);
                }
            }
        }
        int cnt = 0;
        for(i = 0; i < n; ++i){
            if(dist[i] != inf && dist[i] <= dt){
                ++cnt;
            }
        }
        return cnt;
    }
public:
    int findTheCity(int n, vector<vector<int>>& edges, int dt) {
        int i;
        int retId, retCnt;

        memset(mat, inf, sizeof(mat));
        for(i = 0; i < edges.size(); ++i){
            int u = edges[i][0];
            int v = edges[i][1];
            int w = edges[i][2];
            mat[u][v] = mat[v][u] = Min(mat[u][v], w);
        }

        retCnt = 110;
        for(i = n - 1; i >= 0; --i){
            int cnt = spfa(n, i, dt);
            if(cnt < retCnt){      // 找出城市数目最少的最大编号
                retCnt = cnt;
                retId = i;
            }
        }
        return retId;
    }
};

复杂度分析

时间复杂度: O ( n 3 ) O(n^3) O(n3) n n n 是城市节点的数量。

空间复杂度: O ( n 2 ) O(n^2) O(n2)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

【java学习—十四】反射获取类的父类、接口、构造方法、方法(3)

文章目录 1. 通过反射获取一个类的父类和接口2. 反射获取一个类的构造方法3. 反射获取全部构造器4. 通过反射创建一个对象5. 反射机制获取类的方法 1. 通过反射获取一个类的父类和接口 使用反射可以取得&#xff1a; 实现的全部接口 public Class<?>[] getInterfaces(…

Python实现扫雷游戏,代码示例,边玩边学+回忆童年!

文章目录 前言实现总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 扫雷是一款益智类小游戏&#xff0…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

百望云携手华为发布金融信创与数电乐企联合方案 创新金融合规变革

10月27日&#xff0c;北京发布《关于开展全面数字化的电子发票试点工作的公告》&#xff0c;自2023年11月01日起开展数电票试点。千呼万唤始出来&#xff0c;拉开了北京地区企业开展数电票试点的序幕。 百望云作为数电票行业翘楚&#xff0c;电子发票服务平台供应商&#xff0c…

【C/C++底层】内存分配:栈区(Stack)与堆区(Heap)

/*** poject * author jUicE_g2R(qq:3406291309)* file 底层内存分配&#xff1a;栈区(Stack)与堆区(Heap)* * language C/C* EDA Base on MVS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT …

论文阅读:Robust High-Resolution Video Matting with Temporal Guidance

发表时间&#xff1a;2021年8月25日 项目地址&#xff1a;https://peterl1n.github.io/RobustVideoMatting/ 论文地址&#xff1a;https://arxiv.org/pdf/2108.11515.pdf 我们介绍了一种鲁棒的&#xff0c;实时的&#xff0c;高分辨率的人体视频匹配方法&#xff0c;以实现了新…

【C++】:STL——标准模板库介绍 || string类

&#x1f4da;1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 &#x1f4da;2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

得帆信息携手深信服,联合打造高安全PaaS超融合一体化解决方案

上海得帆信息技术有限公司&#xff08;以下简称“得帆”&#xff09;和深信服科技股份有限公司&#xff08;以下简称“深信服”&#xff09;携手推出融合安全性、稳定性、高效性于一体的全新PaaS超融合解决方案。 用户痛点分析 全面推进企业数字化与信息化的趋势下&#xff0c;…

伊朗黑客对以色列科技行业发起恶意软件攻击

最近&#xff0c;安全研究人员发现了一场由“Imperial Kitten”发起的新攻击活动&#xff0c;目标是运输、物流和科技公司。 “Imperial Kitten”又被称为“Tortoiseshell”、“TA456”、“Crimson Sandstorm”和“Yellow Liderc”&#xff0c;多年来一直使用“Marcella Flore…

DVWA - 3

文章目录 XSS&#xff08;Dom&#xff09;lowmediumhighimpossible XSS&#xff08;Dom&#xff09; XSS 主要基于JavaScript语言进行恶意攻击&#xff0c;常用于窃取 cookie&#xff0c;越权操作&#xff0c;传播病毒等。DOM全称为Document Object Model&#xff0c;即文档对…

在CentOS7环境下安装Mysql

1.卸载已有的不需要的环境 使用如下命令&#xff0c;查看系统中是否已经存在mysql和mariadb&#xff08;mysql的一个子分支&#xff09; ps ajx | grep mariadb ps ajx | grep mysql 如果显示与我相同&#xff0c;则代表系统中已经存在这些环境并且已经停止 如果不相同则需要…

Linux 函数库

函数库&#xff1a; 我们的C程序中&#xff0c;并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

块设备的工作模式

块设备的mknod 还是会创建在 /dev 路径下面&#xff0c;这一点和字符设备一样。/dev 路径下面是 devtmpfs 文件系统。这是块设备遇到的第一个文件系统。我们会为这个块设备文件&#xff0c;分配一个特殊的 inode&#xff0c;这一点和字符设备也是一样的。只不过字符设备走 S_IS…

创作者焦点:Royal Flushed(第二章)

一起来看看「Dr. Bomkus 的试炼」幕后的创作故事吧&#xff5e; 「创作者焦点」系列报道将带来六篇关于「Dr. Bomkus 的试炼」游戏的创作过程&#xff0c;以及其独特的游戏玩法和功能。 屏住呼吸&#xff0c;潜入沉没区。穿过 Bomkus 设计的水下迷宫&#xff0c;回到地面上&…

汽车以太网IOP测试新利器

IOP测试目的 汽车以太网物理层IOP&#xff08;Interoperability &#xff09;测试&#xff0c;即测试被测对象以太网物理层之间的互操作性。用于验证车载以太网PHY能否在有限时间内建立稳定的链路&#xff1b;此外&#xff0c;还用于验证车载以太网PHY可靠性相关的诊断特性&am…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

pcl opencv关于flann的冲突:flann_algorithm_t等

问题如下&#xff1a; 引起问题的点&#xff1a; 解决方法&#xff1a;先include pcl后include opencv; 其他解决方式是在环境变量中将pcl置于opencv前面&#xff0c;但是这里如果是先include opencv&#xff0c;后include pcl问题得不到解决&#xff1b;

电源管理芯片知识分享:电源芯片的特点及故障检测方法

电源管理芯片用于对电源的控制和管理&#xff0c;提高设备的性能&#xff0c;被广泛应用于智能家居、电子商务、能源管理、汽车等领域&#xff0c;是现代电子设备不可缺少的部分。因此&#xff0c;对于电源管理芯片的检测也是十分重要的&#xff0c;发现其故障并及时解决&#…

flink 8081 web页面无法被局域网内其他机器访问

实现 http://localhost:8081/#/overview 可以被局域网其他机器访问