leetcode847. 访问所有节点的最短路径

news2024/11/15 5:36:24
  • 847. 访问所有节点的最短路径

状态压缩

这是一个等权无向图,题目要我们求从「一个点都没访问过」到「所有点都被访问」的最短路径。
同时1 <= n <= 12, n 最大只有 12,容易想到使用「状态压缩」来代表「当前点的访问状态」:使用二进制表示长度为 32的 int 的低 12 来代指点是否被访问过。

假设变量 mask存放了「当前点的访问状态」,例如 (000…0101)2 代表编号为 0 和编号为 2 的节点已经被访问过,而编号为 1 的节点尚未被访问。

  • 检查编号为 x 的点是否被访问过时,可以使用位运算 state=(1 << i) & mask,来获取

  • 将标记编号为 x 的节点已经被访问的话,可以使用位运算 mask| (1 << x) 来实现标记。

基于状态压缩的广度优先搜索算法

  • 为什么找到第一个答案时就一定是最短路径了?
  • 或者如Godzil1a所说:正常的Dijstra算法每次选择到未访问的邻接点中最短的,因为权值都是1 所以步数最少一定最短 如果权值不为1那么需要找到所有路径然后比较了
class Solution {
public:
    int shortestPathLength(vector<vector<int>>& graph) {
        int n = graph.size();

        // 1.初始化队列及标记数组,存入起点
        queue< tuple<int, int, int> > q; // 三个属性分别为 idx, mask, dist
        vector<vector<bool>> vis(n, vector<bool>(1 << n)); // 节点编号及当前状态
        for(int i = 0; i < n; i++) {
            q.push({i, 1 << i, 0}); // 存入起点,标记,起始距离0,本题将所有点都设置为了起点
            vis[i][1 << i] = true;
        }

        // 开始搜索
        while(!q.empty()) {
            auto [cur, mask, dist] = q.front(); // 弹出队头元素
            q.pop();

            // 找到答案,返回结果
            if(mask == (1 << n) - 1) return dist;

            // 扩展
            for(int x : graph[cur]) {
                int nextmask = mask | (1 << x);
                if(!vis[x][nextmask]) {
                    q.push({x, nextmask, dist + 1});
                    vis[x][nextmask] = true;
                }
            }
        }
        return 0;
    }
};

// 作者:已注销
// 链接:https://leetcode.cn/problems/shortest-path-visiting-all-nodes/solution/gtalgorithm-tu-jie-fa-ba-hardbian-cheng-v5knb/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。




int main()
{
    cout<<"Hello World"<<endl;
    vector<vector<int>> graph = {{1,2,3},{0},{0},{0}};
    Solution solo;
    auto res =  solo.shortestPathLength(graph);
    cout<< res <<"-";
    return 0;
}

在这里插入图片描述

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

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

相关文章

Windows下部署Appium教程(Android App自动化测试框架搭建)

摘要: 1&#xff0c;appium是开源的移动端自动化测试框架&#xff1b; 2&#xff0c;appium可以测试原生的、混合的、以及移动端的web项目&#xff1b; 3&#xff0c;appium可以测试ios、android、firefox os&#xff1b; 4&#xff0c;appium是跨平台的&#xff0c;可以用在os…

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

文章目录 消息队列概述两大种类RabbitMQ安装及基操Docker中安装添加用户创建Virtual Hosts设置权限添加交换机创建队列交换机绑定队列 五种消息模型SpringBoot整合MQ引入依赖properties配置开启RabbitMQ API使用创建交换机创建队列交换机绑定队列发送消息接收消息 消息确认机制…

Notification API实战

什么是Notification&#xff1f; Notifications API 的接口 Notification 用于配置以向用户显示桌面通知。 这些通知的外观和功能因平台而异&#xff0c;但通常它们会提供一种异步向用户提供信息的方式。 前置要求 win10系统&#xff0c;且通知与操作中开启浏览器的通知权限 浏…

学习 SSL/TLS ,这一篇就够了

写在前面 如果某个网站受 SSL 证书保护&#xff0c;其相应的 URL 中会显示 HTTPS&#xff08;超文本传输安全协议&#xff09;。单击浏览器地址栏的小绿锁&#xff0c;即可查看证书中的详细信息。那么一本证书是如何诞生的&#xff1f;HTTPS 背后的 SSL/TLS 是如何在工作过程中…

❤ vue3 组件传值

❤ vue3 组件传值 [1] 子组件向父组件传值 使用emit使用方法 【子组件】 1、定义 emits,emits的定义是与component、setup等这些属性是同级 emits此时是作为数组&#xff0c;它也可以接收一个对象 2、使用 setup(props, { emit, refs }) {emit(addImg, 参数); }有时候需使…

Ubuntu20.04的cuda、cudnn、paddle安装完整过程

1、查看显卡驱动版本 显卡驱动安装看这篇&#xff1a; https://blog.csdn.net/Trisyp/article/details/131302061?spm1001.2014.3001.5501 然后输入命令nvidia-smi 查看显卡状态 2、CUDA 下载安装 直接手动在官网下载&#xff1a;CUDA Toolkit Archive | NVIDIA Developer…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 21 日论文合集)

文章目录 一、检测相关(14篇)1.1 CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection1.2 Depth and DOF Cues Make A Better Defocus Blur Detector1.3 Spatiotemporal Pyramidal CNN with Depth-Wise Separable Convolution for Eye Blinking Detection …

使用Kettle做数据迁移

1.Kettle简介 Kettle是一个颇受认可的开源ETL(Extract-Transform-Load 的缩写&#xff0c;即数据抽取、转换、装载的过程)工具&#xff0c;2006年被Pentaho收购&#xff0c;2015年又被Hitachi Vantara收购&#xff0c;正式命名为PDI。 PDI EE&#xff08;企业商用版&#xff0…

ASP.NET Core MVC 从入门到精通之Filter

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

【数据分享】1929-2022年全球站点的逐月降雪深度数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

JavaScript排序sort()方法(解决null、undefined、0之间的排序(混乱)问题)

问题&#xff1a; 如果数组内某一对象为空值&#xff0c;排序是怎样的呢&#xff1f;(显然并不是按年龄顺序排序的&#xff0c;因为存在null和undefined) var arr[{"age":24,name:zs},{"age":0,name:ls},{"age":0,name:gr}&#xff0c;{"…

数据结构算法 -分而治之算法

引言 坤坤是一个养鸡场的员工&#xff0c;他非常热爱他的工作&#xff0c;并且总是努力提高他的专业技能。有一天&#xff0c;养鸡场接到了一项任务&#xff1a;在短时间内处理一批大量的鸡。 这批鸡数量非常大&#xff0c;比普通的数量要多得多&#xff0c;坤坤意识到他们需…

作业(Job)——OS

目录 1、批处理作业 2、交互式作业 小结&#xff1a;作业、进程、线程 作业概念 &#xff1a;用户要求计算机系统为其完成的计算任务集合。 作业步&#xff08;job step) &#xff1a;作业处理过程中一个相对独立的步骤 一般一个作业步可由一个进程完成某些作业步之间可以并…

2023世界人工智能大会-图技术高峰论坛重磅来袭!邀您共同参与!

2023年7月6-8日&#xff0c;一年一度的世界人工智能大会&#xff08;WAIC&#xff09;即将拉开帷幕。创邻科技作为大会的战略合作伙伴&#xff0c;将承办第三届图技术高峰论坛。 过去两届图技术论坛&#xff0c;分别以“大数据关联”和“AI应用”为关键词&#xff0c;邀请图技…

基于ChatGPT的端到端语音聊天机器人项目实战(一)

基于ChatGPT的端到端语音聊天机器人项目实战 ChatGPT API后台开发实战 本节主要是跟大家分享一个端到端的基于模型驱动的对话机器人,会有前端和后端,也会有一些具体模型的调用,读者需具有Python语言编程的基础,这是前置性的条件,有了这个基础,理论上讲本节所有的内容,…

Sui Move HackerHouse预热开启,9月大理见

9月3日&#xff0c;Sui Move 主题的 Antalpha HackerHouse 将在大理举办&#xff0c;为期 21 天&#xff0c;向所有 Web3 开发者发出 co-buidling & co-living 邀请。 本期 HackerHouse 由 Antalpha Labs 发起&#xff0c;Sui Foundation赞助&#xff0c;MoveFuns DAO、No…

魔视智能MOTOVIS入选世界经济论坛「2023年度技术先锋」

&#xffee;世界经济论坛&#xff08;World Economic Forum&#xff09;宣布从全球范围内选出了100家最有前途的技术先锋企业&#xff0c;这些企业致力于解决可持续性、气候变化和医疗保健等问题。 &#xffee;作为嵌入式人工智能自动驾驶的推动者&#xff0c;魔视智能MOTOVI…

项目管理,到底管什么?

在以前&#xff0c;项目管理职能单一且明确的时候&#xff0c;大家对项目管理的认知还比较统一&#xff1a;一个项目经理带领一个团队完成一个项目。 而在现在的环境下&#xff0c;尤其是互联网&#xff0c;项目经理的职能和定位以不同公司、不同老板、不同需要而参差不齐&…

制造业数字化转型解决方案

制造业数字化转型解决方案 数字化转型已成为制造业发展的必由之路&#xff0c;要提高生产制造水平&#xff0c;就需要提高对生产运营各环节数据的采集、处理和利用效率。当前的工业数据采集仍存在种种不足&#xff0c;现可以利用具有强大设备接入能力、通信协议转换能力、数据…

多线程(十):总结

本章用来处理一下之前遗漏的很多问题&#xff0c;在多线程那一章&#xff0c;很多常见面试题都没有讲&#xff0c;这里再来补充一下。 HashTable, HashMap, ConcurrentHashMap 之间的区别 HashTable, HashMap, ConcurrentHashMap 都带有Map&#xff0c;它们其实都是 Map 的接…