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

文章目录

  • 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.mfbz.cn/a/144202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux必备基础命令,JAVA程序员必备

目录 一、了解基本的左侧栏什么意思​编辑 二、ls&#xff0c;ll&#xff08;list&#xff0c;查找目录内容) 三、cd(change directory&#xff0c;切换目录) 小技巧&#xff0c;我们在查找东西的时候&#xff0c;可以使用tab进行智能补全。 四、touch&#xff08;建立文件…

R程序 示例4.3.2版本包 在centos进行编译部署

为了在CentOS上下载和编译R语言4.3.2包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.首先&#xff0c;需要安装一些必要的依赖项。可以使用以下命令安装它们&#xff1a; sudo yum install -y epel-release sudo yum install -y gcc gcc-c gcc-gfortran readline-dev…

C#使用时序数据库 InfluxDB

一、安装 https://docs.influxdata.com/influxdb/v2/install/?tWindows 解压后使用cmd运行 访问 localhost:8086 配置 第一次登入会初始化 配置登入账号 保存TOKEN 这个TOKEN用于后期代码链接访问数据库&#xff0c;忘记了只能删除重新生成 点击QUCK START进入管理页面 …

原神助手 一款支持祈愿分析、查看便签状态和获取游戏详细数据的开源工具。

原神助手 「原神助手」支持祈愿分析、查看便签状态和获取游戏详细数据等。 如何获取祈愿链接 如果你是在 Windows 平台上游玩原神并且当前使用的电脑上安装了原神&#xff0c;那么你可以&#xff1a; 打开原神&#xff0c;进入祈愿页面&#xff0c;点击历史记录&#xff0c;…

SQLite3 数据库学习(一):数据库和 SQLite 基础

参考引用 SQL 必知必会SQLite 权威指南&#xff08;第二版&#xff09;关系型数据库概述 1. 数据库基础 1.1 什么是数据库 数据库&#xff08;database&#xff09;&#xff1a;保存有组织的数据的容器&#xff08;通常是一个文件或一组文件&#xff09; 可以将其想象为一个文…

WebMvcConfigurer配置详解

一、简介 WebMvcConfigurer配置类其实是Spring内部的一种配置方式&#xff0c;采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制&#xff0c;可以自定义一些Handler&#xff0c;Interceptor&#xff0c;ViewResolver&#xff0c;MessageConverter。基于ja…

MongoDB入门级别教程全(Windows版,保姆级教程)

下载mongodb 进入官网&#xff1a; Download MongoDB Community Server | MongoDB 选择msi&#xff0c;Windows版本 下载完后直接双击&#xff1a; 选择complete 这里建议改地方&#xff1a; 我这里直接改成d盘&#xff1a;work目录下面&#xff1a; 点击next&#xff1a; 因…

【04】Istio的pilot流量分发机制

4.1 Pilot配置分发机制 Pilot负责网格数据平面相关配置信息的获取&#xff0c;生成&#xff0c;和分发&#xff0c;它通过Service Registry获取网格配置信息并将其转换为XDS接口的标准数据格式&#xff0c;而后经gRPC分发至相关的Envoy; Service Registry&#xff1a;服务注册表…

ARPG----C++学习记录05 Section10 武器类,IK重定向,装备和捡起武器,动画蓝图

代码更新 11.13 BAOfanTing/ARPG_Game_Code7ab54d2 GitHub 武器类 基于item类&#xff0c;创建一个weapon的C类&#xff0c;基于它创建一个蓝图&#xff0c;刀剑的网格体给它。在蓝图里调动之前在C写好的sin函数添加到世界偏移量里&#xff0c;得到一把悬浮刀 在item把重叠函…

13.利用辗转相除法求两个整数的最大公约数和最小公倍数。如96,36

文章目录 前言一、题目描述 二、题目分析 三、解题 前言 本系列为循环结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 利用辗转相除法求两个整数的最大公约数和最小公倍数,如96,36 二、题目分析 最小公倍数(输入的两个数之积)除(它们的最大公约数) 三…

编程怎么学习视频教程,编程实例入门教程,中文编程开发语言工具下载

编程怎么学习视频教程&#xff0c;编程实例入门教程&#xff0c;中文编程开发语言工具下载。 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件…

uniapp项目运行到网易mumu模拟器流程,5分钟不到就可以运行

开发了一个uniappvitevue3的跨平台项目&#xff0c;但是想在手机模拟器中测试一下效果&#xff0c;所以就用网易mumu这个模拟器测试了&#xff0c;因为这是uniapp官方推荐的模拟器&#xff0c;所以下面开始流程&#xff1a;先打开网易mumu模拟器的开发者模拟。系统应用 > 设…

打造全身视角的医院可视化能源监测管理平台,实现医院能源可视化管理

医院是大型公共建筑的一种&#xff0c;随着医院规模的不断扩大&#xff0c;医院能源消耗剧增&#xff0c;能源消耗居高不下。医院对于能源监管的需求也越来越高。医院建立一套能耗监测管理平台&#xff0c;对于降低医院能耗有着非常重要的作用。 医院能耗存在的问题 1、医院能…

突破职场竞争,引领未来发展:考取《研发效能(DevOps)工程师职业技术认证》

就业形势堪忧&#xff0c;什么最有保障&#xff1f;考个“国家级”证书傍身吧&#xff01; 工信部教考中心作为中国领先的行业技能认证机构&#xff0c;其颁发的认证证书不仅代表了个人在信息技术领域的专业能力&#xff0c;更可以录入工业和信息化技术技能人才数据库&#xf…

视频封装格式

FLV&#xff08;Flash Video&#xff09; FLV封装格式 Tag Data分为Audio&#xff0c;Video&#xff0c;Script三种 TS&#xff08;Transport Stream&#xff09;传输流 TS文件分为三层&#xff0c;&#xff08;倒叙更好理解&#xff09; TS层&#xff1a;在PES层基础上加入…

在SpringBoot中使用EhCache缓存

在使用EhCache缓存之前&#xff0c;我们需要了解的是EhCache缓存是啥&#xff1f; Ehcache的概述 Ehcache是一个开源的Java缓存框架&#xff0c;用于提供高效的内存缓存解决方案&#xff0c;他可以用于缓存各种类型的数据&#xff0c;包括对象&#xff0c;查询结果&#xff0…

第二证券:被举牌一般会有几个涨停?

跟着股市的昌盛&#xff0c;越来越多的人初步查验出资&#xff0c;而其中一个备受注重的策略就是“举牌”。举牌是指某个股东对股票达到了必定比例的控制权&#xff0c;并告诉公司的一种行为。这种行为除了会对公司股价构成影响之外&#xff0c;还可以让股民猜疑和进一步价格走…

盘点60个Python网站项目Python爱好者不容错过

盘点60个Python网站项目Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1mY8pNUpZEV0Q-5-UvJTtBA?pwd8888 提取码&#xff1a;8888 项目名称 (No longermainta…

【前端开发】图例宽度根据数值自适应

前端开发 先看结果图 图例的宽度会随数值的改变而变化。 HTML部分 <!-- 数值部分 --> <ul class"tuli" ref"num"><listyle"margin-top: 5px;padding: 0 5px;text-align: center;"v-for"item of itemArr":key"i…

运动耳机哪个牌子好性价比高?运动耳机品牌排行榜前十名

​其实&#xff0c;选择运动耳机并不只是看外观&#xff0c;性能也同样重要。在选择时&#xff0c;我们需要考虑几个关键因素&#xff0c;例如稳固性、舒适度和音质等。这些都是运动耳机必备的要求&#xff0c;因为它们能帮助我们在运动时更加专注于锻炼&#xff0c;而不会被耳…